Add customizations for pimoroni trackball
This commit is contained in:
parent
f3d8172ac4
commit
4645625100
@ -25,3 +25,6 @@
|
||||
#define SPLIT_POINTING_ENABLE
|
||||
#define POINTING_DEVICE_RIGHT
|
||||
#define POINTING_DEVICE_ROTATION_270
|
||||
#define POINTING_DEVICE_AUTO_MOUSE_ENABLE
|
||||
#define AUTO_MOUSE_DEFAULT_LAYER 5
|
||||
#define AUTO_MOUSE_TIME 1000
|
||||
|
||||
@ -1,5 +1,13 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
#include <drivers/sensors/pimoroni_trackball.h>
|
||||
|
||||
enum custom_keycodes {
|
||||
DRAG_SCROLL = QK_USER_0,
|
||||
BALL_HUE,
|
||||
BALL_SAT,
|
||||
BALL_VAL,
|
||||
SAVE_CONF,
|
||||
};
|
||||
|
||||
#ifdef LAYOUT_split_3x6_3_ex2
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
@ -50,6 +58,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
//|--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------|
|
||||
KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RGUI
|
||||
//`--------------------------' `--------------------------'
|
||||
),
|
||||
|
||||
[5] = LAYOUT_split_3x6_3_ex2(
|
||||
//,--------------------------------------------------------------. ,--------------------------------------------------------------.
|
||||
QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DRAG_SCROLL, XXXXXXX, BALL_HUE, BALL_SAT, BALL_VAL, SAVE_CONF,
|
||||
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
|
||||
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
//|--------+--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------+--------|
|
||||
RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
//|--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------|
|
||||
KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RGUI
|
||||
//`--------------------------' `--------------------------'
|
||||
)
|
||||
};
|
||||
#else
|
||||
@ -101,15 +121,212 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
|
||||
KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RALT
|
||||
//`--------------------------' `--------------------------'
|
||||
),
|
||||
|
||||
[5] = LAYOUT_split_3x6_3(
|
||||
//,-----------------------------------------------------. ,-----------------------------------------------------.
|
||||
QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DRAG_SCROLL, XXXXXXX, BALL_HUE, BALL_SAT, BALL_VAL, SAVE_CONF,
|
||||
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
|
||||
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
|
||||
RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
|
||||
KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RALT
|
||||
//`--------------------------' `--------------------------'
|
||||
)
|
||||
};
|
||||
#endif
|
||||
|
||||
bool set_scrolling = false;
|
||||
|
||||
// Modify these values to adjust the scrolling speed
|
||||
#define SCROLL_DIVISOR_H 8.0
|
||||
#define SCROLL_DIVISOR_V 8.0
|
||||
|
||||
// Variables to store accumulated scroll values
|
||||
float scroll_accumulated_h = 0;
|
||||
float scroll_accumulated_v = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void pointing_device_init_user(void) {
|
||||
set_auto_mouse_layer(5);
|
||||
set_auto_mouse_enable(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Trackball related stuff */
|
||||
static bool hue_mode_enabled = 0;
|
||||
static bool sat_mode_enabled = 0;
|
||||
static bool val_mode_enabled = 0;
|
||||
|
||||
typedef union {
|
||||
uint32_t raw;
|
||||
struct {
|
||||
uint8_t tb_hue :8;
|
||||
uint8_t tb_value :8;
|
||||
uint8_t tb_saturation :8;
|
||||
};
|
||||
} user_config_t;
|
||||
|
||||
user_config_t user_config;
|
||||
|
||||
static uint8_t tb_hue = 1;
|
||||
static uint8_t tb_saturation = 255;
|
||||
static uint8_t tb_value = 255;
|
||||
|
||||
#ifndef MIN
|
||||
# define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
void trackball_set_hsv(uint8_t hue, uint8_t sat, uint8_t brightness) {
|
||||
RGB rgb = hsv_to_rgb((HSV){hue, sat, brightness});
|
||||
uint8_t white = MIN(rgb.r, MIN(rgb.g, rgb.b));
|
||||
rgb.r -= white;
|
||||
rgb.g -= white;
|
||||
rgb.b -= white;
|
||||
|
||||
pimoroni_trackball_set_rgbw(rgb.r, rgb.g, rgb.b, white);
|
||||
}
|
||||
|
||||
void keyboard_post_init_user(void) {
|
||||
user_config.raw = eeconfig_read_user();
|
||||
tb_hue = user_config.tb_hue;
|
||||
tb_saturation = user_config.tb_saturation;
|
||||
tb_value = user_config.tb_value;
|
||||
trackball_set_hsv(tb_hue, tb_saturation,tb_value);
|
||||
}
|
||||
|
||||
void eeconfig_init_user(void) {
|
||||
user_config.raw = 0;
|
||||
user_config.tb_hue = 80;
|
||||
user_config.tb_saturation = 80;
|
||||
user_config.tb_value = 80;
|
||||
eeconfig_update_user(user_config.raw);
|
||||
}
|
||||
|
||||
// void suspend_power_down_user(void) {
|
||||
// trackball_set_brightness(0);
|
||||
/* trackball_sleep(); */
|
||||
// }
|
||||
|
||||
bool is_mouse_record_user(uint16_t keycode, keyrecord_t* record) {
|
||||
switch(keycode) {
|
||||
case DRAG_SCROLL:
|
||||
case BALL_HUE:
|
||||
case BALL_SAT:
|
||||
case BALL_VAL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case DRAG_SCROLL:
|
||||
// Toggle set_scrolling when DRAG_SCROLL key is pressed or released
|
||||
set_scrolling = record->event.pressed;
|
||||
break;
|
||||
case BALL_HUE:
|
||||
hue_mode_enabled = record->event.pressed;
|
||||
break;
|
||||
case BALL_SAT:
|
||||
sat_mode_enabled = record->event.pressed;
|
||||
break;
|
||||
case BALL_VAL:
|
||||
val_mode_enabled = record->event.pressed;
|
||||
break;
|
||||
case SAVE_CONF:
|
||||
user_config.tb_value = tb_value;
|
||||
user_config.tb_hue = tb_hue;
|
||||
user_config.tb_saturation = tb_saturation;
|
||||
eeconfig_update_user(user_config.raw);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
|
||||
// Check if drag scrolling is active
|
||||
if (set_scrolling) {
|
||||
// Calculate and accumulate scroll values based on mouse movement and divisors
|
||||
scroll_accumulated_h += (float)mouse_report.x / SCROLL_DIVISOR_H;
|
||||
scroll_accumulated_v += (float)mouse_report.y / SCROLL_DIVISOR_V;
|
||||
|
||||
// Assign integer parts of accumulated scroll values to the mouse report
|
||||
mouse_report.h = (int8_t)scroll_accumulated_h;
|
||||
mouse_report.v = (int8_t)scroll_accumulated_v;
|
||||
|
||||
// Update accumulated scroll values by subtracting the integer parts
|
||||
scroll_accumulated_h -= (int8_t)scroll_accumulated_h;
|
||||
scroll_accumulated_v -= (int8_t)scroll_accumulated_v;
|
||||
|
||||
// Clear the X and Y values of the mouse report
|
||||
mouse_report.x = 0;
|
||||
mouse_report.y = 0;
|
||||
} else if (hue_mode_enabled) {
|
||||
// adjust ball hue
|
||||
tb_hue += mouse_report.y;
|
||||
trackball_set_hsv(tb_hue | 1, tb_saturation, tb_value);
|
||||
} else if (sat_mode_enabled) {
|
||||
// adjust ball saturation
|
||||
tb_saturation += mouse_report.y * 2;
|
||||
trackball_set_hsv(tb_hue, tb_saturation | 1, tb_value);
|
||||
} else if (val_mode_enabled) {
|
||||
// adjust ball value
|
||||
tb_value += mouse_report.y * 2;
|
||||
trackball_set_hsv(tb_hue, tb_saturation, tb_value | 1);
|
||||
}
|
||||
return mouse_report;
|
||||
}
|
||||
|
||||
// Function to handle layer changes and disable drag scrolling when not in AUTO_MOUSE_DEFAULT_LAYER
|
||||
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||
uint8_t layer = get_highest_layer(state);
|
||||
if (layer != AUTO_MOUSE_DEFAULT_LAYER) {
|
||||
set_scrolling = false;
|
||||
}
|
||||
|
||||
switch (layer) {
|
||||
case 1:
|
||||
trackball_set_hsv(tb_hue + 20, tb_saturation, tb_value > 40 ? tb_value - 40 : 0);
|
||||
break;
|
||||
case 2:
|
||||
// numbers + nav
|
||||
trackball_set_hsv(tb_hue + 40, tb_saturation, tb_value > 40 ? tb_value - 40 : 0);
|
||||
break;
|
||||
case 3:
|
||||
// symbols
|
||||
trackball_set_hsv(tb_hue + 40, tb_saturation, tb_value > 40 ? tb_value - 40 : 0);
|
||||
break;
|
||||
case 4:
|
||||
// media
|
||||
trackball_set_hsv(tb_hue + 40, tb_saturation, tb_value > 40 ? tb_value - 40 : 0);
|
||||
break;
|
||||
case 5:
|
||||
// mouse layer
|
||||
trackball_set_hsv(tb_hue, tb_saturation, tb_value);
|
||||
break;
|
||||
default:
|
||||
trackball_set_hsv(tb_hue, tb_saturation, tb_value > 40 ? tb_value - 40 : 0);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
#ifdef ENCODER_MAP_ENABLE
|
||||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
|
||||
[0] = { ENCODER_CCW_CW(RGB_MOD, RGB_RMOD), ENCODER_CCW_CW(RGB_HUI, RGB_HUD), ENCODER_CCW_CW(RGB_VAI, RGB_VAD), ENCODER_CCW_CW(RGB_SAI, RGB_SAD), },
|
||||
[1] = { ENCODER_CCW_CW(RGB_MOD, RGB_RMOD), ENCODER_CCW_CW(RGB_HUI, RGB_HUD), ENCODER_CCW_CW(RGB_VAI, RGB_VAD), ENCODER_CCW_CW(RGB_SAI, RGB_SAD), },
|
||||
[2] = { ENCODER_CCW_CW(RGB_MOD, RGB_RMOD), ENCODER_CCW_CW(RGB_HUI, RGB_HUD), ENCODER_CCW_CW(RGB_VAI, RGB_VAD), ENCODER_CCW_CW(RGB_SAI, RGB_SAD), },
|
||||
[3] = { ENCODER_CCW_CW(RGB_MOD, RGB_RMOD), ENCODER_CCW_CW(RGB_HUI, RGB_HUD), ENCODER_CCW_CW(RGB_VAI, RGB_VAD), ENCODER_CCW_CW(RGB_SAI, RGB_SAD), },
|
||||
[5] = { ENCODER_CCW_CW(RGB_MOD, RGB_RMOD), ENCODER_CCW_CW(RGB_HUI, RGB_HUD), ENCODER_CCW_CW(RGB_VAI, RGB_VAD), ENCODER_CCW_CW(RGB_SAI, RGB_SAD), },
|
||||
};
|
||||
#endif
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user