Parent directory

pointing_device_driver.c

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