diff --git a/keyboards/xoiviox/ffkb/config-pim-ec11.h b/keyboards/xoiviox/ffkb/config-pim-ec11.h index 7ab040ac2a..290eb3e651 100644 --- a/keyboards/xoiviox/ffkb/config-pim-ec11.h +++ b/keyboards/xoiviox/ffkb/config-pim-ec11.h @@ -151,7 +151,9 @@ along with this program. If not, see . /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -#define TRACKBALL_ORIENTATION 2 +#define PIMORONI_TRACKBALL_ROTATE +#define PIMORONI_TRACKBALL_CLICK +#define PIMORONI_TRACKBALL_INVERT_X // If using encoder type 2, uncomment this // #define ENCODERS_B_REVERSE diff --git a/keyboards/xoiviox/ffkb/keymaps/sadekbaroudi/keymap.c b/keyboards/xoiviox/ffkb/keymaps/sadekbaroudi/keymap.c index 1802f1a99e..0db894bb6e 100644 --- a/keyboards/xoiviox/ffkb/keymaps/sadekbaroudi/keymap.c +++ b/keyboards/xoiviox/ffkb/keymaps/sadekbaroudi/keymap.c @@ -15,6 +15,11 @@ */ #include "sadekbaroudi.h" +#ifdef PIMORONI_TRACKBALL_ENABLE +#include "drivers/sensors/pimoroni_trackball.h" +#include "pointing_device.h" +#include "color.h" +#endif #include QMK_KEYBOARD_H /* @@ -228,3 +233,44 @@ void oled_task_user(void) { } #endif + + +#if !defined(RGBLIGHT_ENABLE) && defined(PIMORONI_TRACKBALL_ENABLE) +layer_state_t layer_state_set_keymap(layer_state_t state) { + switch (get_highest_layer(state)) { + case _QWERTY: + if (is_caps_lock_on) { + trackball_set_rgbw(RGB_RED, 0x00); + } else { + trackball_set_rgbw(RGB_BLUE, 0x00); + } + break; + case _NAVIGATION: + trackball_set_rgbw(RGB_GREEN, 0x00); + break; + case _SYMBOLS: + trackball_set_rgbw(RGB_PURPLE, 0x00); + break; + case _FUNCTION: + trackball_set_rgbw(RGB_YELLOW, 0x00); + break; + case _MEDIA: + trackball_set_rgbw(RGB_ORANGE, 0x00); + break; + case _MOUSE: + trackball_set_rgbw(RGB_CYAN, 0x00); + break; + case _WINNAV: + trackball_set_rgbw(RGB_WHITE, 0x00); + break; + default: // for any other layers, or the default layer + if (is_caps_lock_on) { + trackball_set_rgbw(RGB_RED, 0x00); + } else { + trackball_set_rgbw(RGB_BLUE, 0x00); + } + break; + } + return state; +} +#endif diff --git a/users/sadekbaroudi/pimoroni_trackball.c b/users/sadekbaroudi/pimoroni_trackball.c deleted file mode 100644 index a6f60b4f0a..0000000000 --- a/users/sadekbaroudi/pimoroni_trackball.c +++ /dev/null @@ -1,329 +0,0 @@ -#include "pimoroni_trackball.h" -#include "i2c_master.h" -#include "i2c_master.c" -#include "pointing_device.h" -#include "sadekbaroudi.h" - -#ifndef TRACKBALL_NO_MATH -#include "math.h" -# ifndef TRACKBALL_ANGLE_OFFSET -# define TRACKBALL_ANGLE_OFFSET 0 -# endif -#endif - -#undef TRACKBALL_REVERSE_VSCROLL -#undef TRACKBALL_REVERSE_HSCROLL - -#ifndef TRACKBALL_ORIENTATION -# define TRACKBALL_ORIENTATION 0 -#endif - -#ifndef TRACKBALL_REVERSE_VSCROLL -# define TRACKBALL_REVERSE_VSCROLL false -#endif - -#ifndef TRACKBALL_REVERSE_HSCROLL -# define TRACKBALL_REVERSE_HSCROLL false -#endif - -#ifndef TRACKBALL_ACCELERATION_WINDOW -# define TRACKBALL_ACCELERATION_WINDOW 50000 // ms window to increase acceleration factor -#endif - -// Sadek: I commented this line out, as I don't have the interrupt pin connected -//#define TRACKBALL_INTERRUPT_PIN D3 -#define TRACKBALL_TIMEOUT 5 - -bool scrolling = false; -bool trackball_idle = true; -uint8_t tb_brightness = 42; - - -void trackball_init(void) { - i2c_init(); -#ifdef TRACKBALL_INTERRUPT_PIN - setPinInput(TRACKBALL_INTERRUPT_PIN); - writePinLow(TRACKBALL_INTERRUPT_PIN); - uint8_t data[] = {REG_INTERRUPT_PIN, MASK_INTERRUPT_PIN_ENABLE}; - i2c_transmit(TRACKBALL_WRITE, data, 2, TB_I2C_TIMEOUT); -#endif -} - -bool trackball_get_interrupt(void) { -#ifndef TRACKBALL_INTERRUPT_PIN - uint8_t data[1] = {}; - i2c_readReg(TRACKBALL_WRITE, REG_INTERRUPT_PIN, data, 1, TB_I2C_TIMEOUT); - - return data[0] & MASK_INTERRUPT_TRIGGERED; -#else - return !readPin(TRACKBALL_INTERRUPT_PIN); -#endif -} - -void trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white) { - uint8_t data[] = {0x00, red, green, blue, white}; - i2c_transmit(TRACKBALL_WRITE, data, 5, TB_I2C_TIMEOUT); -} - -void trackball_read_state(uint8_t* data, uint16_t size_of_data) { - i2c_readReg(TRACKBALL_WRITE, REG_LEFT, data, size_of_data, TB_I2C_TIMEOUT); -} - -void trackball_set_scrolling(bool scroll) { - scrolling = scroll; -} - -trackball_state_t trackball_get_state(void) { - // up down left right button - uint8_t s[5] = {}; - trackball_read_state(s, 5); - - trackball_state_t state = { -#if TRACKBALL_ORIENTATION == 0 - // Pimoroni text is up - .y = s[0] - s[1], - .x = s[3] - s[2], -#elif TRACKBALL_ORIENTATION == 1 - // Pimoroni text is right - .y = s[3] - s[2], - .x = s[1] - s[0], -#elif TRACKBALL_ORIENTATION == 2 - // Pimoroni text is down - .y = s[1] - s[0], - .x = s[2] - s[3], -#else - // Pimoroni text is left - .y = s[2] - s[3], - .x = s[0] - s[1], -#endif - .button_down = s[4] & 0x80, - .button_triggered = s[4] & 0x01, - }; - -#ifndef TRACKBALL_NO_MATH - state.angle_rad = atan2(state.y, state.x) + TRACKBALL_ANGLE_OFFSET; - state.vector_length = sqrt(pow(state.x, 2) + pow(state.y, 2)); - state.raw_x = state.x; - state.raw_y = state.y; - state.x = (int16_t)(state.vector_length * cos(state.angle_rad)); - state.y = (int16_t)(state.vector_length * sin(state.angle_rad)); -#endif - - return state; -} - -void trackball_sleep(void) { - /* not sure how this is supposed to work */ - uint8_t data[] = {REG_CTRL, MSK_CTRL_FWRITE | MSK_CTRL_SLEEP}; - i2c_transmit(TRACKBALL_WRITE, data, 2, TB_I2C_TIMEOUT); -} - -void trackball_set_brightness(uint8_t brightness) { - uint8_t data[4] = {}; - i2c_readReg(TRACKBALL_WRITE, REG_RED, data, 4, TB_I2C_TIMEOUT); - for (int i=0; i<4; i++) { - if (data[i]) { - data[i] = brightness; - } - } - i2c_writeReg(TRACKBALL_WRITE, REG_RED, data, 4, TB_I2C_TIMEOUT); -} - -#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; - - trackball_set_rgbw(rgb.r, rgb.g, rgb.b, white); -} - - -__attribute__((weak)) void pointing_device_init(void) { - trackball_init(); - trackball_set_rgbw(0,0,tb_brightness,0); -} - - -__attribute__((weak)) void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y, int16_t h, int16_t v) { - mouse_report->x = x; - mouse_report->y = y; - mouse_report->h = h; - mouse_report->v = v; -} -__attribute__((weak)) void update_member(int8_t* member, int16_t* offset) { - if (*offset > 127) { - *member = 127; - *offset -= 127; - } else if (*offset < -127) { - *member = -127; - *offset += 127; - } else { - *member = *offset; - *offset = 0; - } -} - -__attribute__((weak)) bool has_report_changed(report_mouse_t new, report_mouse_t old) { - return (new.buttons != old.buttons) || - (new.x && new.x != old.x) || - (new.y && new.y != old.y) || - (new.h && new.h != old.h) || - (new.v && new.v != old.v); -} - -static int16_t x_offset = 0; -static int16_t y_offset = 0; -static int16_t v_offset = 0; -static int16_t h_offset = 0; -static int16_t tb_timer = 0; -uint16_t acceleration_timer = 0; - -__attribute__((weak)) void process_mouse(report_mouse_t* mouse, bool fast_scroll) { - static int8_t new_x_offset = 0; - static int8_t new_y_offset = 0; - static int8_t new_v_offset = 0; - static int8_t new_h_offset = 0; - if (trackball_get_interrupt() && (!tb_timer || timer_elapsed(tb_timer) > TRACKBALL_TIMEOUT)) { - tb_timer = timer_read() | 1; - - trackball_state_t state = trackball_get_state(); - - if (state.button_triggered) { - if(state.button_down) { - mouse->buttons |= MOUSE_BTN1; - } else { - mouse->buttons &= ~MOUSE_BTN1; - } - } else { - - - //-------------------------------------------------------------- - //DONT WANT TO MOVE THESE BUT HERE THEY ARE - //-------------------------------------------------------------- - float power = 2.5; - float var_accel = 1; - if (fast_scroll) { - var_accel = 2; - power = 3; - } - double newlen = pow(state.vector_length*var_accel, power); - - //float var_accel = 2; //acceleration factor - //double newlen = pow(state.vector_length, power); - - /* - if (state.vector_length > 3 && (timer_elapsed(acceleration_timer) == 0 || timer_elapsed(acceleration_timer) < TRACKBALL_ACCELERATION_WINDOW)) { - acceleration_timer = timer_read(); - newlen += pow(state.vector_length*var_accel, power); - } else { - acceleration_timer = timer_read(); - newlen += pow(state.vector_length, power); - } - */ - //newlen = pow(state.vector_length, power); - - x_offset += (newlen * cos(state.angle_rad)); - y_offset += (newlen * sin(state.angle_rad)); - - - /* - float y_correction = 0.8; - if ( y_offset > 0 && ((newlen * sin(state.angle_rad) * y_correction == 0)) { - y_offset = 0.2; - } - else { - y_offset *= y_correction; - } - */ - - #if TRACKBALL_REVERSE_VSCROLL == true - v_offset += (newlen * sin(state.angle_rad)); - #else - v_offset -= (newlen * sin(state.angle_rad)); - #endif - #if TRACKBALL_REVERSE_HSCROLL == true - h_offset -= (newlen * cos(state.angle_rad)); - #else - h_offset += (newlen * cos(state.angle_rad)); - #endif - } - - } - - while (x_offset || y_offset || h_offset || v_offset) { - update_member(&new_x_offset, &x_offset); - update_member(&new_y_offset, &y_offset); - - update_member(&new_v_offset, &v_offset); - update_member(&new_h_offset, &h_offset); - - mouse->x = new_x_offset; - mouse->y = new_y_offset; - mouse->v = new_v_offset; - mouse->h = new_h_offset; - } -} - -__attribute__((weak)) void pointing_device_task(void) { - report_mouse_t mouse_report = pointing_device_get_report(); - - // look into whether or not I'd want this - //bool fast_scroll = (get_highest_layer(layer_state) == _SYMBOLS); - bool fast_scroll = false; - process_mouse(&mouse_report, fast_scroll); - - // Logic for colors is in rgb_stuff.c - // Note that for now, if RGBLIGHT_ENABLE is not set, this won't run, so they are tied together, I can fix later - - // If I ever want to use scrolling, set the rules here - if (layer_state_is(_NAVIGATION)) { - trackball_set_scrolling(true); - } else { - trackball_set_scrolling(false); - } - - pointing_device_set_report(mouse_report); - pointing_device_send(); -} - -__attribute__((weak)) void pointing_device_send(void) { - static report_mouse_t old_report = {}; - report_mouse_t mouseReport = pointing_device_get_report(); - if (is_keyboard_master()) { - int8_t x = mouseReport.x, y = mouseReport.y, h = mouseReport.h, v = mouseReport.v; - mouseReport.x = 0; - mouseReport.y = 0; - mouseReport.h = 0; - mouseReport.v = 0; - if (!scrolling) { - process_mouse_user(&mouseReport, x, y, 0, 0); - } else { - process_mouse_user(&mouseReport, 0, 0, h, v); - } - - if (has_report_changed(mouseReport, old_report)) { - trackball_idle = false; - host_mouse_send(&mouseReport); - } else { - trackball_idle = true; - } - } else { - if (has_report_changed(mouseReport, old_report)) { - trackball_idle = false; - } else { - trackball_idle = true; - } - - } - mouseReport.x = 0; - mouseReport.y = 0; - mouseReport.v = 0; - mouseReport.h = 0; - old_report = mouseReport; - pointing_device_set_report(mouseReport); -} \ No newline at end of file diff --git a/users/sadekbaroudi/pimoroni_trackball.h b/users/sadekbaroudi/pimoroni_trackball.h deleted file mode 100644 index 8eccff6431..0000000000 --- a/users/sadekbaroudi/pimoroni_trackball.h +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once - -#include -#include "color.h" - -#ifndef TRACKBALL_ADDRESS -# define TRACKBALL_ADDRESS 0x0A -#endif - -#ifndef TRACKBALL_ANGLE_OFFSET -# define TRACKBALL_ANGLE_OFFSET 0 -#endif - -#define TRACKBALL_WRITE ((TRACKBALL_ADDRESS << 1) | I2C_WRITE) -#define TRACKBALL_READ ((TRACKBALL_ADDRESS << 1) | I2C_READ) - -#define TB_I2C_TIMEOUT 100 - -#define REG_RED 0x00 -#define REG_GREEN 0x01 -#define REG_BLUE 0x02 -#define REG_WHITE 0x03 - -#define REG_LEFT 0x04 - -#define REG_INTERRUPT_PIN 0xF9 -#define MASK_INTERRUPT_TRIGGERED 0x01 -#define MASK_INTERRUPT_PIN_ENABLE 0x02 - -#define REG_CTRL 0xFE -#define MSK_CTRL_SLEEP 0b00000001 -#define MSK_CTRL_RESET 0b00000010 -#define MSK_CTRL_FREAD 0b00000100 -#define MSK_CTRL_FWRITE 0b00001000 - - -typedef struct { - int16_t x; - int16_t y; - bool button_down; - bool button_triggered; -#ifndef TRACKBALL_NO_MATH - double vector_length; - double angle_rad; - int8_t raw_x; - int8_t raw_y; -#endif -} trackball_state_t; - -void trackball_init(void); -bool trackball_get_interrupt(void); -void trackball_set_rgbw(uint8_t r, uint8_t g, uint8_t b, uint8_t w); -void trackball_read_state(uint8_t* data, uint16_t size_of_data); -void trackball_sleep(void); -void trackball_set_brightness(uint8_t brightness); -void trackball_set_hsv(uint8_t hue, uint8_t sat, uint8_t brightness); -void trackball_set_scrolling (bool scroll); - -trackball_state_t trackball_get_state(void); - -void pointing_device_init(void); -void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y, int16_t h, int16_t v); -void update_member(int8_t* member, int16_t* offset); -bool has_report_changed(report_mouse_t new, report_mouse_t old); -void process_mouse(report_mouse_t* mouse, bool fast_scroll); -void pointing_device_task(void); -void pointing_device_send(void); \ No newline at end of file diff --git a/users/sadekbaroudi/rules.mk b/users/sadekbaroudi/rules.mk index 9b5cd08ce9..08482deddb 100755 --- a/users/sadekbaroudi/rules.mk +++ b/users/sadekbaroudi/rules.mk @@ -69,7 +69,8 @@ endif ifeq ($(strip $(PIMORONI_TRACKBALL_ENABLE)), yes) POINTING_DEVICE_ENABLE := yes - SRC += pimoroni_trackball.c + SRC += drivers/sensors/pimoroni_trackball.c + QUANTUM_LIB_SRC += i2c_master.c OPT_DEFS += -DPIMORONI_TRACKBALL_ENABLE endif