qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

pointing_device_driver.c (2398B)


      1 // Copyright 2024 Dasky (@daskygit)
      2 // SPDX-License-Identifier: GPL-2.0-or-later
      3 
      4 #include "report.h"
      5 #include "test_pointing_device_driver.h"
      6 #include <string.h>
      7 
      8 typedef struct {
      9     bool pressed;
     10     bool dirty;
     11 } pd_button_state_t;
     12 
     13 typedef struct {
     14     int16_t           x;
     15     int16_t           y;
     16     int16_t           h;
     17     int16_t           v;
     18     pd_button_state_t button_state[8];
     19     uint16_t          cpi;
     20     bool              initiated;
     21 } pd_config_t;
     22 
     23 static pd_config_t pd_config = {0};
     24 
     25 bool pointing_device_driver_init(void) {
     26     pd_set_init(true);
     27     return pd_config.initiated;
     28 }
     29 
     30 report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) {
     31     for (uint8_t i = 0; i < 8; i++) {
     32         if (pd_config.button_state[i].dirty) {
     33             pd_config.button_state[i].dirty = false;
     34             if (pd_config.button_state[i].pressed) {
     35                 mouse_report.buttons |= 1 << (i);
     36             } else {
     37                 mouse_report.buttons &= ~(1 << (i));
     38             }
     39         }
     40     }
     41     mouse_report.x = pd_config.x;
     42     mouse_report.y = pd_config.y;
     43     mouse_report.h = pd_config.h;
     44     mouse_report.v = pd_config.v;
     45     return mouse_report;
     46 }
     47 
     48 __attribute__((weak)) uint16_t pointing_device_driver_get_cpi(void) {
     49     return pd_config.cpi;
     50 }
     51 
     52 __attribute__((weak)) void pointing_device_driver_set_cpi(uint16_t cpi) {
     53     pd_config.cpi = cpi;
     54 }
     55 
     56 void pd_press_button(uint8_t btn) {
     57     pd_config.button_state[btn].dirty   = true;
     58     pd_config.button_state[btn].pressed = true;
     59 }
     60 void pd_release_button(uint8_t btn) {
     61     pd_config.button_state[btn].dirty   = true;
     62     pd_config.button_state[btn].pressed = false;
     63 }
     64 
     65 void pd_clear_all_buttons(void) {
     66     for (uint8_t i = 0; i < 8; i++) {
     67         pd_config.button_state[i].dirty   = true;
     68         pd_config.button_state[i].pressed = false;
     69     }
     70 }
     71 
     72 void pd_set_x(int16_t x) {
     73     pd_config.x = x;
     74 }
     75 
     76 void pd_clear_x(void) {
     77     pd_set_x(0);
     78 }
     79 
     80 void pd_set_y(int16_t y) {
     81     pd_config.y = y;
     82 }
     83 void pd_clear_y(void) {
     84     pd_set_y(0);
     85 }
     86 
     87 void pd_set_h(int16_t h) {
     88     pd_config.h = h;
     89 }
     90 void pd_clear_h(void) {
     91     pd_set_h(0);
     92 }
     93 
     94 void pd_set_v(int16_t v) {
     95     pd_config.v = v;
     96 }
     97 void pd_clear_v(void) {
     98     pd_set_v(0);
     99 }
    100 
    101 void pd_clear_movement(void) {
    102     pd_set_x(0);
    103     pd_set_y(0);
    104     pd_set_h(0);
    105     pd_set_v(0);
    106 }
    107 
    108 void pd_set_init(bool success) {
    109     pd_config.initiated = success;
    110 }