Rework and expand Pointing Device support (#14343)
Co-authored-by: Dasky <32983009+daskygit@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									462c3a6151
								
							
						
					
					
						commit
						56e3f06a26
					
				
					 60 changed files with 2107 additions and 1705 deletions
				
			
		| 
						 | 
				
			
			@ -37,20 +37,17 @@
 | 
			
		|||
#    define OPT_SCALE 1  // Multiplier for wheel
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define PLOOPY_DPI_OPTIONS { CPI375, CPI750, CPI1375 }
 | 
			
		||||
#define PLOOPY_DPI_OPTIONS \
 | 
			
		||||
    { 375, 750, 1375 }
 | 
			
		||||
#define PLOOPY_DPI_DEFAULT 2
 | 
			
		||||
 | 
			
		||||
#ifndef PLOOPY_DRAGSCROLL_DPI
 | 
			
		||||
#    define PLOOPY_DRAGSCROLL_DPI CPI375 // Fixed-DPI Drag Scroll
 | 
			
		||||
#    define PLOOPY_DRAGSCROLL_DPI 375  // Fixed-DPI Drag Scroll
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef PLOOPY_DRAGSCROLL_MULTIPLIER
 | 
			
		||||
#    define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75 // Variable-DPI Drag Scroll
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Transformation constants for delta-X and delta-Y
 | 
			
		||||
const static float ADNS_X_TRANSFORM = -1.0;
 | 
			
		||||
const static float ADNS_Y_TRANSFORM = 1.0;
 | 
			
		||||
 | 
			
		||||
keyboard_config_t keyboard_config;
 | 
			
		||||
uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS;
 | 
			
		||||
#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t))
 | 
			
		||||
| 
						 | 
				
			
			@ -70,12 +67,7 @@ uint8_t OptLowPin = OPT_ENC1;
 | 
			
		|||
bool debug_encoder = false;
 | 
			
		||||
bool     is_drag_scroll    = false;
 | 
			
		||||
 | 
			
		||||
__attribute__((weak)) void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v) {
 | 
			
		||||
    mouse_report->h = h;
 | 
			
		||||
    mouse_report->v = v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__((weak)) void process_wheel(report_mouse_t* mouse_report) {
 | 
			
		||||
void process_wheel(report_mouse_t* mouse_report) {
 | 
			
		||||
    // If the mouse wheel was just released, do not scroll.
 | 
			
		||||
    if (timer_elapsed(lastMidClick) < SCROLL_BUTT_DEBOUNCE)
 | 
			
		||||
        return;
 | 
			
		||||
| 
						 | 
				
			
			@ -103,33 +95,31 @@ __attribute__((weak)) void process_wheel(report_mouse_t* mouse_report) {
 | 
			
		|||
    if (dir == 0)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    process_wheel_user(mouse_report, mouse_report->h, (int)(mouse_report->v + (dir * OPT_SCALE)));
 | 
			
		||||
    mouse_report->v = (int8_t)(dir * OPT_SCALE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__((weak)) void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) {
 | 
			
		||||
    mouse_report->x = x;
 | 
			
		||||
    mouse_report->y = y;
 | 
			
		||||
void pointing_device_init_kb(void) {
 | 
			
		||||
    opt_encoder_init();
 | 
			
		||||
 | 
			
		||||
    // set the DPI.
 | 
			
		||||
    pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__((weak)) void process_mouse(report_mouse_t* mouse_report) {
 | 
			
		||||
    report_adns_t data = adns_read_burst();
 | 
			
		||||
report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
 | 
			
		||||
 | 
			
		||||
    if (data.dx != 0 || data.dy != 0) {
 | 
			
		||||
        if (debug_mouse)
 | 
			
		||||
            dprintf("Raw ] X: %d, Y: %d\n", data.dx, data.dy);
 | 
			
		||||
 | 
			
		||||
        // Apply delta-X and delta-Y transformations.
 | 
			
		||||
        // x and y are swapped
 | 
			
		||||
        // the sensor is rotated
 | 
			
		||||
        // by 90 degrees
 | 
			
		||||
        float xt = (float) data.dy * ADNS_X_TRANSFORM;
 | 
			
		||||
        float yt = (float) data.dx * ADNS_Y_TRANSFORM;
 | 
			
		||||
 | 
			
		||||
        int16_t xti = (int16_t)xt;
 | 
			
		||||
        int16_t yti = (int16_t)yt;
 | 
			
		||||
 | 
			
		||||
        process_mouse_user(mouse_report, xti, yti);
 | 
			
		||||
    if (is_drag_scroll) {
 | 
			
		||||
        mouse_report.h = mouse_report.x;
 | 
			
		||||
#ifdef PLOOPY_DRAGSCROLL_INVERT
 | 
			
		||||
        // Invert vertical scroll direction
 | 
			
		||||
        mouse_report.v = -mouse_report.y;
 | 
			
		||||
#else
 | 
			
		||||
        mouse_report.v = mouse_report.y;
 | 
			
		||||
#endif
 | 
			
		||||
        mouse_report.x = 0;
 | 
			
		||||
        mouse_report.y = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return pointing_device_task_user(mouse_report);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
 | 
			
		||||
| 
						 | 
				
			
			@ -147,7 +137,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
 | 
			
		|||
    if (keycode == DPI_CONFIG && record->event.pressed) {
 | 
			
		||||
        keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;
 | 
			
		||||
        eeconfig_update_kb(keyboard_config.raw);
 | 
			
		||||
        adns_set_cpi(dpi_array[keyboard_config.dpi_config]);
 | 
			
		||||
        pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (keycode == DRAG_SCROLL) {
 | 
			
		||||
| 
						 | 
				
			
			@ -157,7 +147,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
 | 
			
		|||
        {
 | 
			
		||||
            is_drag_scroll ^= 1;
 | 
			
		||||
        }
 | 
			
		||||
        adns_set_cpi(is_drag_scroll ? PLOOPY_DRAGSCROLL_DPI : dpi_array[keyboard_config.dpi_config]);
 | 
			
		||||
        pointing_device_set_cpi(is_drag_scroll ? PLOOPY_DRAGSCROLL_DPI : dpi_array[keyboard_config.dpi_config]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/* If Mousekeys is disabled, then use handle the mouse button
 | 
			
		||||
| 
						 | 
				
			
			@ -168,11 +158,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
 | 
			
		|||
#ifndef MOUSEKEY_ENABLE
 | 
			
		||||
    if (IS_MOUSEKEY_BUTTON(keycode)) {
 | 
			
		||||
        report_mouse_t currentReport = pointing_device_get_report();
 | 
			
		||||
        if (record->event.pressed) {
 | 
			
		||||
            currentReport.buttons |= 1 << (keycode - KC_MS_BTN1);
 | 
			
		||||
        } else {
 | 
			
		||||
            currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1));
 | 
			
		||||
        }
 | 
			
		||||
        currentReport.buttons        = pointing_device_handle_buttons(currentReport.buttons, record->event.pressed, keycode - KC_MS_BTN1);
 | 
			
		||||
        pointing_device_set_report(currentReport);
 | 
			
		||||
        pointing_device_send();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -207,48 +193,6 @@ void keyboard_pre_init_kb(void) {
 | 
			
		|||
    keyboard_pre_init_user();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pointing_device_init(void) {
 | 
			
		||||
    adns_init();
 | 
			
		||||
    opt_encoder_init();
 | 
			
		||||
 | 
			
		||||
    // reboot the adns.
 | 
			
		||||
    // if the adns hasn't initialized yet, this is harmless.
 | 
			
		||||
    adns_write_reg(REG_CHIP_RESET, 0x5a);
 | 
			
		||||
 | 
			
		||||
    // wait maximum time before adns is ready.
 | 
			
		||||
    // this ensures that the adns is actuall ready after reset.
 | 
			
		||||
    wait_ms(55);
 | 
			
		||||
 | 
			
		||||
    // read a burst from the adns and then discard it.
 | 
			
		||||
    // gets the adns ready for write commands
 | 
			
		||||
    // (for example, setting the dpi).
 | 
			
		||||
    adns_read_burst();
 | 
			
		||||
 | 
			
		||||
    // set the DPI.
 | 
			
		||||
    adns_set_cpi(dpi_array[keyboard_config.dpi_config]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pointing_device_task(void) {
 | 
			
		||||
    report_mouse_t mouse_report = pointing_device_get_report();
 | 
			
		||||
    process_wheel(&mouse_report);
 | 
			
		||||
    process_mouse(&mouse_report);
 | 
			
		||||
 | 
			
		||||
    if (is_drag_scroll) {
 | 
			
		||||
        mouse_report.h = mouse_report.x;
 | 
			
		||||
#ifdef PLOOPY_DRAGSCROLL_INVERT
 | 
			
		||||
        // Invert vertical scroll direction
 | 
			
		||||
        mouse_report.v = -mouse_report.y;
 | 
			
		||||
#else
 | 
			
		||||
        mouse_report.v = mouse_report.y;
 | 
			
		||||
#endif
 | 
			
		||||
        mouse_report.x = 0;
 | 
			
		||||
        mouse_report.y = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pointing_device_set_report(mouse_report);
 | 
			
		||||
    pointing_device_send();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void eeconfig_init_kb(void) {
 | 
			
		||||
    keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT;
 | 
			
		||||
    eeconfig_update_kb(keyboard_config.raw);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue