diff --git a/keyboards/crkbd/qmk/qmk_firmware/rev4_1/config.h b/keyboards/crkbd/qmk/qmk_firmware/rev4_1/config.h index 8cc51b3e..fdb84858 100644 --- a/keyboards/crkbd/qmk/qmk_firmware/rev4_1/config.h +++ b/keyboards/crkbd/qmk/qmk_firmware/rev4_1/config.h @@ -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 diff --git a/keyboards/crkbd/vial-kb/vial-qmk/keymaps/vial/keymap.c b/keyboards/crkbd/vial-kb/vial-qmk/keymaps/vial/keymap.c index 2faaff26..f92dbac1 100644 --- a/keyboards/crkbd/vial-kb/vial-qmk/keymaps/vial/keymap.c +++ b/keyboards/crkbd/vial-kb/vial-qmk/keymaps/vial/keymap.c @@ -1,5 +1,13 @@ #include QMK_KEYBOARD_H +#include +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