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 }