Keyboards/RGBKB/Mün (#13239)
This commit is contained in:
parent
f8c01a8e5a
commit
8b059088ba
27 changed files with 2049 additions and 0 deletions
101
keyboards/rgbkb/common/common_oled.c
Normal file
101
keyboards/rgbkb/common/common_oled.c
Normal file
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <https://github.com/Legonut> wrote this file. As long as you retain this
|
||||
* notice you can do whatever you want with this stuff. If we meet some day, and
|
||||
* you think this stuff is worth it, you can buy me a beer in return. David Rauseo
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "common_oled.h"
|
||||
#include "oled_driver.h"
|
||||
#include "rgb_matrix.h"
|
||||
|
||||
// for memcpy
|
||||
#include <string.h>
|
||||
#include <transactions.h>
|
||||
|
||||
typedef struct {
|
||||
bool selecting;
|
||||
uint8_t selection;
|
||||
} kb_menu_status_t;
|
||||
|
||||
static kb_menu_status_t rgb_menu = { false, 4 };
|
||||
static bool rgb_menu_changed = false;
|
||||
|
||||
void render_logo(void) {
|
||||
static const char PROGMEM font_logo[] = {
|
||||
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
|
||||
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
|
||||
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0};
|
||||
oled_write_P(font_logo, false);
|
||||
}
|
||||
|
||||
void render_icon(void) {
|
||||
static const char PROGMEM font_icon[] = {
|
||||
0x9b,0x9c,0x9d,0x9e,0x9f,
|
||||
0xbb,0xbc,0xbd,0xbe,0xbf,
|
||||
0xdb,0xdc,0xdd,0xde,0xdf,0
|
||||
};
|
||||
oled_write_P(font_icon, false);
|
||||
}
|
||||
|
||||
#define RGB_FUNCTION_COUNT 6
|
||||
typedef void (*rgb_matrix_f)(void);
|
||||
const rgb_matrix_f rgb_matrix_functions[RGB_FUNCTION_COUNT][2] = {
|
||||
{ rgb_matrix_increase_hue, rgb_matrix_decrease_hue },
|
||||
{ rgb_matrix_increase_sat, rgb_matrix_decrease_sat },
|
||||
{ rgb_matrix_increase_val, rgb_matrix_decrease_val },
|
||||
{ rgb_matrix_increase_speed, rgb_matrix_decrease_speed },
|
||||
{ rgb_matrix_step, rgb_matrix_step_reverse },
|
||||
{ rgb_matrix_toggle, rgb_matrix_toggle }
|
||||
};
|
||||
|
||||
void render_rgb_menu(void) {
|
||||
static char buffer[63] = {0};
|
||||
snprintf(buffer, sizeof(buffer), "Hue %3dSatrn %3dValue %3dSpeed %3dMode %3dEnbld %3d",
|
||||
rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v, rgb_matrix_config.speed, rgb_matrix_config.mode, rgb_matrix_config.enable);
|
||||
|
||||
if (rgb_menu.selecting) {
|
||||
buffer[5 + rgb_menu.selection * 10] = '*';
|
||||
}
|
||||
else {
|
||||
buffer[5 + rgb_menu.selection * 10] = '>';
|
||||
}
|
||||
oled_write(buffer, false);
|
||||
}
|
||||
|
||||
void rgb_menu_selection(void) {
|
||||
if (!is_keyboard_master()) return;
|
||||
rgb_menu.selecting = !rgb_menu.selecting;
|
||||
rgb_menu_changed = true;
|
||||
}
|
||||
|
||||
void rgb_menu_action(bool clockwise) {
|
||||
if (!is_keyboard_master()) return;
|
||||
if (rgb_menu.selecting) {
|
||||
if (!clockwise) {
|
||||
rgb_menu.selection = (rgb_menu.selection - 1);
|
||||
if (rgb_menu.selection >= RGB_FUNCTION_COUNT)
|
||||
rgb_menu.selection = RGB_FUNCTION_COUNT - 1;
|
||||
}
|
||||
else {
|
||||
rgb_menu.selection = (rgb_menu.selection + 1) % RGB_FUNCTION_COUNT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
(*rgb_matrix_functions[rgb_menu.selection][clockwise])();
|
||||
}
|
||||
rgb_menu_changed = true;
|
||||
}
|
||||
|
||||
void rgb_menu_update(int8_t transaction_id) {
|
||||
if (!is_keyboard_master()) return;
|
||||
if (!rgb_menu_changed) return;
|
||||
rgb_menu_changed = false;
|
||||
transaction_rpc_send(transaction_id, sizeof(kb_menu_status_t), &rgb_menu);
|
||||
}
|
||||
|
||||
void rgb_menu_slave_sync(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
|
||||
memcpy(&rgb_menu, initiator2target_buffer, sizeof(kb_menu_status_t));
|
||||
}
|
21
keyboards/rgbkb/common/common_oled.h
Normal file
21
keyboards/rgbkb/common/common_oled.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <https://github.com/Legonut> wrote this file. As long as you retain this
|
||||
* notice you can do whatever you want with this stuff. If we meet some day, and
|
||||
* you think this stuff is worth it, you can buy me a beer in return. David Rauseo
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
void render_logo(void);
|
||||
void render_icon(void);
|
||||
void render_rgb_menu(void);
|
||||
void rgb_menu_selection(void);
|
||||
void rgb_menu_action(bool clockwise);
|
||||
void rgb_menu_update(int8_t transaction_id);
|
||||
void rgb_menu_slave_sync(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer);
|
240
keyboards/rgbkb/common/glcdfont.c
Normal file
240
keyboards/rgbkb/common/glcdfont.c
Normal file
|
@ -0,0 +1,240 @@
|
|||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <https://github.com/Legonut> wrote this file. As long as you retain this
|
||||
* notice you can do whatever you want with this stuff. If we meet some day, and
|
||||
* you think this stuff is worth it, you can buy me a beer in return. David Rauseo
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "progmem.h"
|
||||
|
||||
// Helidox 8x6 font with RGBKB SOL Logo
|
||||
// Online editor: http://teripom.x0.com/
|
||||
|
||||
static const unsigned char font[] PROGMEM = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
|
||||
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
|
||||
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
|
||||
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
|
||||
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
|
||||
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
|
||||
0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
|
||||
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
|
||||
0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
|
||||
0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
|
||||
0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
|
||||
0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
|
||||
0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
|
||||
0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
|
||||
0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
|
||||
0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
|
||||
0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
|
||||
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
|
||||
0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
|
||||
0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
|
||||
0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
|
||||
0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
|
||||
0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
|
||||
0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
|
||||
0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
|
||||
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
|
||||
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
|
||||
0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
|
||||
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
|
||||
0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
|
||||
0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
|
||||
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
|
||||
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
|
||||
0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
|
||||
0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
|
||||
0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
|
||||
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
|
||||
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
|
||||
0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
|
||||
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
|
||||
0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
|
||||
0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
|
||||
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
|
||||
0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
|
||||
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
|
||||
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
|
||||
0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
|
||||
0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
|
||||
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
|
||||
0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
|
||||
0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
|
||||
0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
|
||||
0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
|
||||
0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
|
||||
0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
|
||||
0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
|
||||
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
|
||||
0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
|
||||
0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
|
||||
0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
|
||||
0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
|
||||
0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
|
||||
0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
|
||||
0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
|
||||
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
|
||||
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
|
||||
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
|
||||
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
|
||||
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
|
||||
0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
|
||||
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
|
||||
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
|
||||
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
|
||||
0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
|
||||
0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
|
||||
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
|
||||
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
|
||||
0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
|
||||
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
|
||||
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
|
||||
0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
|
||||
0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
|
||||
0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
|
||||
0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
|
||||
0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
|
||||
0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
|
||||
0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
|
||||
0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
|
||||
0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
|
||||
0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
|
||||
0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
|
||||
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
|
||||
0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
|
||||
0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00,
|
||||
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
|
||||
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
|
||||
0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
|
||||
0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
|
||||
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
|
||||
0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
|
||||
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
|
||||
0xFC, 0x18, 0x24, 0x24, 0x18, 0x00,
|
||||
0x18, 0x24, 0x24, 0x18, 0xFC, 0x00,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
|
||||
0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
|
||||
0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
|
||||
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
|
||||
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
|
||||
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
|
||||
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
|
||||
0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
|
||||
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
|
||||
0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
|
||||
0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
|
||||
0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
|
||||
0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
|
||||
0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
|
||||
0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0x80,
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x80, 0x00, 0x00, 0x0C, 0x90,
|
||||
0xB0, 0xE0, 0x72, 0x31, 0x9B, 0xDE,
|
||||
0xCE, 0xEC, 0xEE, 0xE9, 0xE9, 0xEC,
|
||||
0xCF, 0xDA, 0x99, 0x3E, 0x62, 0xE4,
|
||||
0xC4, 0x70, 0x10, 0x10, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
|
||||
0xC0, 0xC0, 0x80, 0x80, 0x02, 0x85,
|
||||
0x85, 0x87, 0x85, 0x89, 0x89, 0x92,
|
||||
0xEA, 0xC6, 0xC4, 0x48, 0x50, 0x60,
|
||||
0x40, 0x40, 0x40, 0x40, 0xC0, 0xE0,
|
||||
0x50, 0x28, 0x10, 0x10, 0x60, 0xC0,
|
||||
0x40, 0x40, 0x40, 0x40, 0x80, 0x80,
|
||||
0x80, 0x80, 0x80, 0xE0, 0xF8, 0xFC,
|
||||
0xF8, 0xF0, 0x00, 0x00, 0x00, 0x00,
|
||||
0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
|
||||
0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
|
||||
0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
|
||||
0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
|
||||
0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
|
||||
0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
|
||||
0x00, 0x00, 0xF0, 0xF4, 0xEC, 0xDE,
|
||||
0xDE, 0xBE, 0x3E, 0x3E, 0x3F, 0x3F,
|
||||
0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x3F,
|
||||
0x3F, 0x3E, 0x3E, 0xBE, 0xDE, 0xDE,
|
||||
0xEC, 0xF4, 0xF0, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x7F, 0x80, 0x80,
|
||||
0x80, 0x70, 0x0F, 0x00, 0x00, 0x80,
|
||||
0x7F, 0x00, 0x00, 0x7F, 0x80, 0x80,
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x7F,
|
||||
0x00, 0x00, 0x80, 0x80, 0x80, 0x80,
|
||||
0x80, 0x80, 0x80, 0xFF, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x40, 0x21, 0x33, 0x3B, 0x7B,
|
||||
0xFF, 0x00, 0x7C, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x01,
|
||||
0xFF, 0xDE, 0x8C, 0x04, 0x0C, 0x08,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x01, 0x01, 0x01, 0x7F, 0x80,
|
||||
0x80, 0xBE, 0xBE, 0x80, 0x80, 0x80,
|
||||
0xC1, 0xFF, 0x80, 0x04, 0x32, 0x5E,
|
||||
0x1C, 0x3D, 0x26, 0x10, 0xC1, 0xFF,
|
||||
0x3E, 0x00, 0x00, 0x08, 0x36, 0xC1,
|
||||
0x08, 0x08, 0x14, 0x77, 0x94, 0x94,
|
||||
0x94, 0xF7, 0x94, 0xF7, 0x9C, 0x9C,
|
||||
0xFF, 0xFF, 0x1E, 0x00, 0x00, 0x00,
|
||||
0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
|
||||
0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
|
||||
0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
|
||||
0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
|
||||
0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
|
||||
0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
|
||||
0x00, 0x00, 0x01, 0x0F, 0x3F, 0xFF,
|
||||
0xFF, 0xFF, 0xFC, 0xE0, 0x80, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x80, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF,
|
||||
0x3F, 0x0F, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x06, 0x02, 0x06,
|
||||
0x4D, 0x4F, 0x8C, 0xF9, 0x73, 0x37,
|
||||
0x27, 0x2F, 0x2F, 0xAF, 0xEF, 0x6F,
|
||||
0x77, 0x17, 0x33, 0x79, 0xCC, 0x1F,
|
||||
0x31, 0x20, 0x21, 0x02, 0x02, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x40, 0xE0,
|
||||
0xA0, 0xA0, 0xD0, 0x90, 0x48, 0x48,
|
||||
0x25, 0x2B, 0x11, 0x09, 0x05, 0x03,
|
||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x03, 0x02, 0x04, 0x03, 0x01,
|
||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
|
||||
0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F,
|
||||
0x0F, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F,
|
||||
0xFE, 0xFC, 0x00, 0xFC, 0xFE, 0x7F,
|
||||
0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
310
keyboards/rgbkb/common/touch_encoder.c
Normal file
310
keyboards/rgbkb/common/touch_encoder.c
Normal file
|
@ -0,0 +1,310 @@
|
|||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <https://github.com/XScorpion2> wrote this file. As long as you retain this
|
||||
* notice you can do whatever you want with this stuff. If we meet some day, and
|
||||
* you think this stuff is worth it, you can buy me a beer in return. Ryan Caltabiano
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "i2c_master.h"
|
||||
#include "keyboard.h"
|
||||
#include "touch_encoder.h"
|
||||
#include "print.h"
|
||||
#include "wait.h"
|
||||
#include "timer.h"
|
||||
|
||||
// for memcpy
|
||||
#include <string.h>
|
||||
#include <transactions.h>
|
||||
|
||||
#define I2C_ADDRESS 0x1C
|
||||
#define CALIBRATION_BIT 0x80
|
||||
#define OVERFLOW_BIT 0x40
|
||||
#define SLIDER_BIT 0x02
|
||||
|
||||
#ifndef TOUCH_UPDATE_INTERVAL
|
||||
# define TOUCH_UPDATE_INTERVAL 33
|
||||
#endif
|
||||
|
||||
enum { // QT2120 registers
|
||||
QT_CHIP_ID = 0,
|
||||
QT_FIRMWARE_VERSION,
|
||||
QT_DETECTION_STATUS,
|
||||
QT_KEY_STATUS,
|
||||
QT_SLIDER_POSITION = 5,
|
||||
QT_CALIBRATE,
|
||||
QT_RESET,
|
||||
QT_LP,
|
||||
QT_TTD,
|
||||
QT_ATD,
|
||||
QT_DI,
|
||||
QT_TRD,
|
||||
QT_DHT,
|
||||
QT_SLIDER_OPTION,
|
||||
QT_CHARDE_TIME,
|
||||
QT_KEY0_DTHR,
|
||||
QT_KEY1_DTHR,
|
||||
QT_KEY2_DTHR,
|
||||
QT_KEY3_DTHR,
|
||||
QT_KEY4_DTHR,
|
||||
QT_KEY5_DTHR,
|
||||
QT_KEY6_DTHR,
|
||||
QT_KEY7_DTHR,
|
||||
QT_KEY8_DTHR,
|
||||
QT_KEY9_DTHR,
|
||||
QT_KEY10_DTHR,
|
||||
QT_KEY11_DTHR,
|
||||
QT_KEY0_CTRL,
|
||||
QT_KEY1_CTRL,
|
||||
QT_KEY2_CTRL,
|
||||
QT_KEY3_CTRL,
|
||||
QT_KEY4_CTRL,
|
||||
QT_KEY5_CTRL,
|
||||
QT_KEY6_CTRL,
|
||||
QT_KEY7_CTRL,
|
||||
QT_KEY8_CTRL,
|
||||
QT_KEY9_CTRL,
|
||||
QT_KEY10_CTRL,
|
||||
QT_KEY11_CTRL,
|
||||
QT_KEY0_PULSE_SCALE,
|
||||
QT_KEY1_PULSE_SCALE,
|
||||
QT_KEY2_PULSE_SCALE,
|
||||
QT_KEY3_PULSE_SCALE,
|
||||
QT_KEY4_PULSE_SCALE,
|
||||
QT_KEY5_PULSE_SCALE,
|
||||
QT_KEY6_PULSE_SCALE,
|
||||
QT_KEY7_PULSE_SCALE,
|
||||
QT_KEY8_PULSE_SCALE,
|
||||
QT_KEY9_PULSE_SCALE,
|
||||
QT_KEY10_PULSE_SCALE,
|
||||
QT_KEY11_PULSE_SCALE,
|
||||
QT_KEY0_SIGNAL,
|
||||
QT_KEY1_SIGNAL = 54,
|
||||
QT_KEY2_SIGNAL = 56,
|
||||
QT_KEY3_SIGNAL = 58,
|
||||
QT_KEY4_SIGNAL = 60,
|
||||
QT_KEY5_SIGNAL = 62,
|
||||
QT_KEY6_SIGNAL = 64,
|
||||
QT_KEY7_SIGNAL = 66,
|
||||
QT_KEY8_SIGNAL = 68,
|
||||
QT_KEY9_SIGNAL = 70,
|
||||
QT_KEY10_SIGNAL = 72,
|
||||
QT_KEY11_SIGNAL = 74,
|
||||
QT_KEY0_REFERENCE = 76,
|
||||
QT_KEY1_REFERENCE = 78,
|
||||
QT_KEY2_REFERENCE = 80,
|
||||
QT_KEY3_REFERENCE = 82,
|
||||
QT_KEY4_REFERENCE = 84,
|
||||
QT_KEY5_REFERENCE = 86,
|
||||
QT_KEY6_REFERENCE = 88,
|
||||
QT_KEY7_REFERENCE = 90,
|
||||
QT_KEY8_REFERENCE = 92,
|
||||
QT_KEY9_REFERENCE = 94,
|
||||
QT_KEY10_REFERENCE = 96,
|
||||
QT_KEY11_REFERENCE = 98,
|
||||
};
|
||||
|
||||
bool touch_initialized = false;
|
||||
bool touch_disabled = false;
|
||||
uint8_t touch_handness = 0;
|
||||
// touch_raw & touch_processed store the Detection Status, Key Status (x2), and Slider Position values
|
||||
uint8_t touch_raw[4] = { 0 };
|
||||
uint8_t touch_processed[4] = { 0 };
|
||||
|
||||
uint16_t touch_timer = 0;
|
||||
uint16_t touch_update_timer = 0;
|
||||
|
||||
// For split transport only
|
||||
typedef struct {
|
||||
uint8_t position;
|
||||
uint8_t taps;
|
||||
} slave_touch_status_t;
|
||||
|
||||
bool touch_slave_init = false;
|
||||
slave_touch_status_t touch_slave_state = { 0, 0 };
|
||||
|
||||
static bool write_register8(uint8_t address, uint8_t data) {
|
||||
i2c_status_t status = i2c_writeReg((I2C_ADDRESS << 1), address, &data, sizeof(data), I2C_TIMEOUT);
|
||||
if (status != I2C_STATUS_SUCCESS) {
|
||||
xprintf("write_register8 %d failed %d\n", address, status);
|
||||
}
|
||||
return status == I2C_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static bool read_register(uint8_t address, uint8_t* data, uint16_t length) {
|
||||
i2c_status_t status = i2c_readReg((I2C_ADDRESS << 1), address, data, length, I2C_TIMEOUT);
|
||||
if (status != I2C_STATUS_SUCCESS) {
|
||||
xprintf("read_register %d failed %d\n", address, status);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void touch_encoder_init(void) {
|
||||
i2c_init();
|
||||
|
||||
touch_handness = is_keyboard_left() ? 0 : 1;
|
||||
|
||||
// Set QT to slider mode
|
||||
touch_initialized = write_register8(QT_SLIDER_OPTION, 0x80);
|
||||
touch_initialized &= write_register8(QT_TTD, 4); // Toward Drift - 20 @ 3.2s
|
||||
touch_initialized &= write_register8(QT_ATD, 1); // Away Drift - 5 @ 0.8s
|
||||
touch_initialized &= write_register8(QT_DI, 4); // Detection Integrator - 4
|
||||
touch_initialized &= write_register8(QT_TRD, 0); // Touch Recall - 48
|
||||
touch_encoder_calibrate();
|
||||
}
|
||||
|
||||
__attribute__((weak)) bool touch_encoder_tapped_kb(uint8_t index, uint8_t section) { return touch_encoder_tapped_user(index, section); }
|
||||
__attribute__((weak)) bool touch_encoder_update_kb(uint8_t index, bool clockwise) { return touch_encoder_update_user(index, clockwise); }
|
||||
|
||||
__attribute__((weak)) bool touch_encoder_tapped_user(uint8_t index, uint8_t section) { return true; }
|
||||
__attribute__((weak)) bool touch_encoder_update_user(uint8_t index, bool clockwise) { return true; }
|
||||
|
||||
static void touch_encoder_update_tapped(void) {
|
||||
// Started touching, being counter for TOUCH_TERM
|
||||
if (touch_processed[0] & SLIDER_BIT) {
|
||||
touch_timer = timer_read() + TOUCH_TERM;
|
||||
return;
|
||||
}
|
||||
|
||||
// Touch held too long, bail
|
||||
if (timer_expired(timer_read(), touch_timer)) return;
|
||||
|
||||
uint8_t section = touch_processed[3] / (UINT8_MAX / TOUCH_SEGMENTS + 1);
|
||||
xprintf("tap %d %d\n", touch_handness, section);
|
||||
if (is_keyboard_master()) {
|
||||
if (!touch_disabled) {
|
||||
touch_encoder_tapped_kb(touch_handness, section);
|
||||
}
|
||||
}
|
||||
else {
|
||||
touch_slave_state.taps ^= (1 << section);
|
||||
}
|
||||
}
|
||||
|
||||
static void touch_encoder_update_position_common(uint8_t* position, uint8_t raw, uint8_t index) {
|
||||
int8_t delta = (*position - raw) / TOUCH_RESOLUTION;
|
||||
bool clockwise = raw > *position;
|
||||
if (delta == 0) return;
|
||||
|
||||
// Don't store raw directly, as we want to ensure any remainder is kept and used next time this is called
|
||||
*position -= delta * TOUCH_RESOLUTION;
|
||||
xprintf("pos %d %d\n", index, raw);
|
||||
//uint8_t u_delta = delta < 0 ? -delta : delta;
|
||||
if (!touch_disabled) {
|
||||
//for (uint8_t i = 0; i < u_delta; i++)
|
||||
touch_encoder_update_kb(index, clockwise);
|
||||
}
|
||||
}
|
||||
|
||||
static void touch_encoder_update_position(void) {
|
||||
// If the user touchs and moves enough, expire touch_timer faster and do encoder position logic instead
|
||||
if (!timer_expired(timer_read(), touch_timer)) {
|
||||
if ((uint8_t)(touch_raw[3] - touch_processed[3]) <= TOUCH_DEADZONE) return;
|
||||
touch_timer = timer_read();
|
||||
}
|
||||
|
||||
if (is_keyboard_master()) {
|
||||
touch_encoder_update_position_common(&touch_processed[3], touch_raw[3], touch_handness);
|
||||
}
|
||||
else {
|
||||
touch_slave_state.position = touch_raw[3];
|
||||
}
|
||||
}
|
||||
|
||||
void touch_encoder_update_slave(slave_touch_status_t slave_state) {
|
||||
if (!touch_slave_init) {
|
||||
touch_slave_state = slave_state;
|
||||
touch_slave_init = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (touch_slave_state.position != slave_state.position) {
|
||||
// Did a new slide event start?
|
||||
uint8_t mask = (1 << 7);
|
||||
if ((touch_slave_state.taps & mask) != (slave_state.taps & mask)) {
|
||||
touch_slave_state.position = slave_state.position;
|
||||
}
|
||||
touch_encoder_update_position_common(&touch_slave_state.position, slave_state.position, !touch_handness);
|
||||
}
|
||||
|
||||
if (touch_slave_state.taps != slave_state.taps) {
|
||||
if (!touch_disabled) {
|
||||
for (uint8_t section = 0; section < TOUCH_SEGMENTS; section++) {
|
||||
uint8_t mask = (1 << section);
|
||||
if ((touch_slave_state.taps & mask) != (slave_state.taps & mask)) {
|
||||
xprintf("tap %d %d\n", !touch_handness, section);
|
||||
touch_encoder_tapped_kb(!touch_handness, section);
|
||||
}
|
||||
}
|
||||
}
|
||||
touch_slave_state.taps = slave_state.taps;
|
||||
}
|
||||
}
|
||||
|
||||
void touch_encoder_update(int8_t transaction_id) {
|
||||
if (!touch_initialized) return;
|
||||
#if TOUCH_UPDATE_INTERVAL > 0
|
||||
if (!timer_expired(timer_read(), touch_update_timer)) return;
|
||||
touch_update_timer = timer_read() + TOUCH_UPDATE_INTERVAL;
|
||||
#endif
|
||||
|
||||
read_register(QT_DETECTION_STATUS, &touch_raw[0], sizeof(touch_raw));
|
||||
touch_processed[1] = touch_raw[1];
|
||||
touch_processed[2] = touch_raw[2];
|
||||
|
||||
if (touch_raw[0] != touch_processed[0]) {
|
||||
uint8_t delta = touch_raw[0] ^ touch_processed[0];
|
||||
touch_processed[0] = touch_raw[0];
|
||||
// When calibrating, normal sensor behavior is supended
|
||||
if (delta & CALIBRATION_BIT) {
|
||||
xprintf("calibration %d\n", touch_processed[0] >> 7 & 1);
|
||||
}
|
||||
if (delta & OVERFLOW_BIT) {
|
||||
xprintf("overflow %d\n", touch_processed[0] >> 6 & 1);
|
||||
}
|
||||
if (delta & SLIDER_BIT) {
|
||||
touch_processed[3] = touch_raw[3];
|
||||
if (!is_keyboard_master()) {
|
||||
touch_slave_state.position = touch_raw[3];
|
||||
touch_slave_state.taps ^= (1 << 7);
|
||||
}
|
||||
touch_encoder_update_tapped();
|
||||
}
|
||||
}
|
||||
|
||||
if ((touch_raw[0] & SLIDER_BIT) && touch_processed[3] != touch_raw[3]) {
|
||||
touch_encoder_update_position();
|
||||
}
|
||||
|
||||
if (is_keyboard_master()) {
|
||||
slave_touch_status_t slave_state;
|
||||
if (transaction_rpc_exec(transaction_id, sizeof(bool), &touch_disabled, sizeof(slave_touch_status_t), &slave_state)) {
|
||||
if (memcmp(&touch_slave_state, &slave_state, sizeof(slave_touch_status_t)))
|
||||
touch_encoder_update_slave(slave_state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void touch_encoder_calibrate(void) {
|
||||
if (!touch_initialized) return;
|
||||
write_register8(QT_CALIBRATE, 0x01);
|
||||
}
|
||||
|
||||
bool touch_encoder_calibrating(void) {
|
||||
return touch_raw[0] & CALIBRATION_BIT;
|
||||
}
|
||||
|
||||
void touch_encoder_toggle(void) {
|
||||
touch_disabled = !touch_disabled;
|
||||
}
|
||||
|
||||
bool touch_encoder_toggled(void) {
|
||||
return touch_disabled;
|
||||
}
|
||||
|
||||
void touch_encoder_slave_sync(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
|
||||
touch_disabled = *(bool*)initiator2target_buffer;
|
||||
memcpy(target2initiator_buffer, &touch_slave_state, sizeof(slave_touch_status_t));
|
||||
}
|
54
keyboards/rgbkb/common/touch_encoder.h
Normal file
54
keyboards/rgbkb/common/touch_encoder.h
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <https://github.com/XScorpion2> wrote this file. As long as you retain this
|
||||
* notice you can do whatever you want with this stuff. If we meet some day, and
|
||||
* you think this stuff is worth it, you can buy me a beer in return. Ryan Caltabiano
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifndef TOUCH_TERM
|
||||
# define TOUCH_TERM 350
|
||||
#endif
|
||||
|
||||
#ifndef TOUCH_SEGMENTS
|
||||
# define TOUCH_SEGMENTS 3
|
||||
#elif TOUCH_SEGMENTS < 1 || TOUCH_SEGMENTS > 5
|
||||
# error TOUCH_SEGMENTS must be between 1 and 5.
|
||||
#endif
|
||||
|
||||
#ifndef TOUCH_DEADZONE
|
||||
# define TOUCH_DEADZONE 50
|
||||
#endif
|
||||
|
||||
#ifndef TOUCH_RESOLUTION
|
||||
# define TOUCH_RESOLUTION 25
|
||||
#endif
|
||||
|
||||
void touch_encoder_init(void);
|
||||
void touch_encoder_update(int8_t transaction_id);
|
||||
|
||||
void touch_encoder_calibrate(void);
|
||||
bool touch_encoder_calibrating(void);
|
||||
|
||||
void touch_encoder_toggle(void);
|
||||
bool touch_encoder_toggled(void);
|
||||
|
||||
// Called when touch encoder is tapped, weak function overridable by the kb
|
||||
bool touch_encoder_tapped_kb(uint8_t index, uint8_t section);
|
||||
|
||||
// Called when touch encoder is slid, weak function overridable by the kb
|
||||
bool touch_encoder_update_kb(uint8_t index, bool clockwise);
|
||||
|
||||
// Called when touch encoder is tapped, weak function overridable by the user
|
||||
bool touch_encoder_tapped_user(uint8_t index, uint8_t section);
|
||||
|
||||
// Called when touch encoder is slid, weak function overridable by the user
|
||||
bool touch_encoder_update_user(uint8_t index, bool clockwise);
|
||||
|
||||
void touch_encoder_slave_sync(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer);
|
Loading…
Add table
Add a link
Reference in a new issue