aboutsummaryrefslogtreecommitdiff
path: root/keyboards
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2021-11-14 22:03:24 -0800
committerGitHub <noreply@github.com>2021-11-14 22:03:24 -0800
commit56e3f06a26851976e559aacf7a096c61403304be (patch)
tree1e9ec98ad239fdd241e77ac4c4822fc2721a9cea /keyboards
parent462c3a615113e84ac3ca837a5caeb928c0ec8505 (diff)
downloadqmk_firmware-56e3f06a26851976e559aacf7a096c61403304be.tar.gz
qmk_firmware-56e3f06a26851976e559aacf7a096c61403304be.zip
Rework and expand Pointing Device support (#14343)
Co-authored-by: Dasky <32983009+daskygit@users.noreply.github.com>
Diffstat (limited to 'keyboards')
-rw-r--r--keyboards/40percentclub/nano/keymaps/drashna/config.h (renamed from keyboards/oddball/pmw/pmw.h)21
-rw-r--r--keyboards/40percentclub/nano/keymaps/drashna/keymap.c95
-rw-r--r--keyboards/40percentclub/nano/keymaps/drashna/rules.mk11
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/config.h1
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c11
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/rules.mk4
-rw-r--r--keyboards/handwired/tractyl_manuform/tm_sync.c3
-rw-r--r--keyboards/handwired/tractyl_manuform/tractyl_manuform.c81
-rw-r--r--keyboards/oddball/config.h3
-rw-r--r--keyboards/oddball/keymaps/default/config.h1
-rw-r--r--keyboards/oddball/keymaps/default/rules.mk1
-rw-r--r--keyboards/oddball/keymaps/pmw3360/config.h1
-rw-r--r--keyboards/oddball/keymaps/pmw3360/rules.mk1
-rw-r--r--keyboards/oddball/oddball.c54
-rw-r--r--keyboards/oddball/optical_sensor/optical_sensor.h53
-rw-r--r--keyboards/oddball/pmw/pmw.c226
-rw-r--r--keyboards/oddball/pmw/pmw3360_srom_0x04.h280
-rw-r--r--keyboards/oddball/rules.mk4
-rw-r--r--keyboards/ploopyco/mouse/mouse.c117
-rw-r--r--keyboards/ploopyco/mouse/mouse.h6
-rw-r--r--keyboards/ploopyco/mouse/rules.mk5
-rw-r--r--keyboards/ploopyco/trackball/rules.mk5
-rw-r--r--keyboards/ploopyco/trackball/trackball.c105
-rw-r--r--keyboards/ploopyco/trackball/trackball.h6
-rw-r--r--keyboards/ploopyco/trackball_mini/config.h6
-rw-r--r--keyboards/ploopyco/trackball_mini/keymaps/drag_scroll/keymap.c2
-rw-r--r--keyboards/ploopyco/trackball_mini/rules.mk6
-rw-r--r--keyboards/ploopyco/trackball_mini/trackball_mini.c108
-rw-r--r--keyboards/ploopyco/trackball_mini/trackball_mini.h5
-rw-r--r--keyboards/ploopyco/trackball_nano/config.h6
-rw-r--r--keyboards/ploopyco/trackball_nano/keymaps/maddie/keymap.c22
-rw-r--r--keyboards/ploopyco/trackball_nano/rules.mk7
-rw-r--r--keyboards/ploopyco/trackball_nano/trackball_nano.c116
-rw-r--r--keyboards/ploopyco/trackball_nano/trackball_nano.h13
-rw-r--r--keyboards/tkw/grandiceps/rev2/rules.mk3
35 files changed, 169 insertions, 1220 deletions
diff --git a/keyboards/oddball/pmw/pmw.h b/keyboards/40percentclub/nano/keymaps/drashna/config.h
index cc3c9ec5e..411ee8a81 100644
--- a/keyboards/oddball/pmw/pmw.h
+++ b/keyboards/40percentclub/nano/keymaps/drashna/config.h
@@ -1,4 +1,4 @@
1/* Copyright 2020 Alexander Tulloh 1/* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
2 * 2 *
3 * This program is free software: you can redistribute it and/or modify 3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by 4 * it under the terms of the GNU General Public License as published by
@@ -16,20 +16,7 @@
16 16
17#pragma once 17#pragma once
18 18
19#include <stdint.h> 19#define ANALOG_JOYSTICK_X_AXIS_PIN B4
20#define ANALOG_JOYSTICK_Y_AXIS_PIN B5
20 21
21typedef struct { 22#define ANALOG_JOYSTICK_CLICK_PIN E6
22 /* 100 - 12000 CPI supported */
23 uint16_t cpi;
24} config_pmw_t;
25
26typedef struct {
27 int16_t x;
28 int16_t y;
29} report_pmw_t;
30
31void pmw_init(void);
32config_pmw_t pmw_get_config(void);
33void pmw_set_config(config_pmw_t);
34/* Reads and clears the current delta values on the PMW sensor */
35report_pmw_t pmw_get_report(void);
diff --git a/keyboards/40percentclub/nano/keymaps/drashna/keymap.c b/keyboards/40percentclub/nano/keymaps/drashna/keymap.c
index 13f89dd53..cc5991d7a 100644
--- a/keyboards/40percentclub/nano/keymaps/drashna/keymap.c
+++ b/keyboards/40percentclub/nano/keymaps/drashna/keymap.c
@@ -29,98 +29,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
29 29
30}; 30};
31// clang-format on 31// clang-format on
32
33// Joystick
34// Set Pins
35// uint8_t xPin = 8; // VRx / /B4
36// uint8_t yPin = 7; // VRy // B5
37uint8_t swPin = E6; // SW
38
39// Set Parameters
40uint16_t minAxisValue = 0;
41uint16_t maxAxisValue = 1023;
42
43uint8_t maxCursorSpeed = 2;
44uint8_t precisionSpeed = 1;
45uint8_t speedRegulator = 20; // Lower Values Create Faster Movement
46
47int8_t xPolarity = 1;
48int8_t yPolarity = 1;
49
50uint8_t cursorTimeout = 10;
51
52int16_t xOrigin, yOrigin;
53
54uint16_t lastCursor = 0;
55
56int16_t axisCoordinate(uint8_t pin, uint16_t origin) {
57 int8_t direction;
58 int16_t distanceFromOrigin;
59 int16_t range;
60
61 int16_t position = analogReadPin(pin);
62
63 if (origin == position) {
64 return 0;
65 } else if (origin > position) {
66 distanceFromOrigin = origin - position;
67 range = origin - minAxisValue;
68 direction = -1;
69 } else {
70 distanceFromOrigin = position - origin;
71 range = maxAxisValue - origin;
72 direction = 1;
73 }
74
75 float percent = (float)distanceFromOrigin / range;
76 int16_t coordinate = (int16_t)(percent * 100);
77 if (coordinate < 0) {
78 return 0;
79 } else if (coordinate > 100) {
80 return 100 * direction;
81 } else {
82 return coordinate * direction;
83 }
84}
85
86int8_t axisToMouseComponent(uint8_t pin, int16_t origin, uint8_t maxSpeed, int8_t polarity) {
87 int coordinate = axisCoordinate(pin, origin);
88 if (coordinate != 0) {
89 float percent = (float)coordinate / 100;
90 if (get_mods() & MOD_BIT(KC_LSFT)) {
91 return percent * precisionSpeed * polarity * (abs(coordinate) / speedRegulator);
92 } else {
93 return percent * maxCursorSpeed * polarity * (abs(coordinate) / speedRegulator);
94 }
95 } else {
96 return 0;
97 }
98}
99
100void pointing_device_task(void) {
101 report_mouse_t report = pointing_device_get_report();
102
103 // todo read as one vector
104 if (timer_elapsed(lastCursor) > cursorTimeout) {
105 lastCursor = timer_read();
106 report.x = axisToMouseComponent(B4, xOrigin, maxCursorSpeed, xPolarity);
107 report.y = axisToMouseComponent(B5, yOrigin, maxCursorSpeed, yPolarity);
108 }
109 //
110 if (!readPin(E6)) {
111 report.buttons |= MOUSE_BTN1;
112 } else {
113 report.buttons &= ~MOUSE_BTN1;
114 }
115
116 pointing_device_set_report(report);
117 pointing_device_send();
118}
119
120void matrix_init_keymap(void) {
121 // init pin? Is needed?
122 setPinInputHigh(E6);
123 // Account for drift
124 xOrigin = analogReadPin(B4);
125 yOrigin = analogReadPin(B5);
126}
diff --git a/keyboards/40percentclub/nano/keymaps/drashna/rules.mk b/keyboards/40percentclub/nano/keymaps/drashna/rules.mk
index 2b72a112b..aa7966a8b 100644
--- a/keyboards/40percentclub/nano/keymaps/drashna/rules.mk
+++ b/keyboards/40percentclub/nano/keymaps/drashna/rules.mk
@@ -1,7 +1,6 @@
1POINTING_DEVICE_ENABLE = yes 1POINTING_DEVICE_ENABLE = yes
2RGBLIGHT_ENABLE = no 2POINTING_DEVICE_DRIVER = analog_joystick
3CONSOLE_ENABLE = no 3RGBLIGHT_ENABLE = no
4CONSOLE_ENABLE = no
4 5
5BOOTLOADER = qmk-dfu 6BOOTLOADER = qmk-dfu
6
7SRC += analog.c
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/config.h b/keyboards/handwired/tractyl_manuform/5x6_right/config.h
index ce35197f7..6f702bd59 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/config.h
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/config.h
@@ -31,6 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
31#define DIODE_DIRECTION COL2ROW 31#define DIODE_DIRECTION COL2ROW
32 32
33#define ROTATIONAL_TRANSFORM_ANGLE -25 33#define ROTATIONAL_TRANSFORM_ANGLE -25
34#define POINTING_DEVICE_INVERT_X
34 35
35/* Bootmagic Lite key configuration */ 36/* Bootmagic Lite key configuration */
36#define BOOTMAGIC_LITE_ROW 0 37#define BOOTMAGIC_LITE_ROW 0
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c b/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c
index 5bfc21fd1..127595076 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c
@@ -174,7 +174,11 @@ bool tap_toggling = false;
174# define TAP_CHECK TAPPING_TERM 174# define TAP_CHECK TAPPING_TERM
175# endif 175# endif
176 176
177void process_mouse_user(report_mouse_t* mouse_report, int8_t x, int8_t y) { 177report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
178 int8_t x = mouse_report.x, y = mouse_report.y;
179 mouse_report.x = 0;
180 mouse_report.y = 0;
181
178 if (x != 0 && y != 0) { 182 if (x != 0 && y != 0) {
179 mouse_timer = timer_read(); 183 mouse_timer = timer_read();
180# ifdef OLED_ENABLE 184# ifdef OLED_ENABLE
@@ -185,13 +189,14 @@ void process_mouse_user(report_mouse_t* mouse_report, int8_t x, int8_t y) {
185 x = (x > 0 ? x * x / 16 + x : -x * x / 16 + x); 189 x = (x > 0 ? x * x / 16 + x : -x * x / 16 + x);
186 y = (y > 0 ? y * y / 16 + y : -y * y / 16 + y); 190 y = (y > 0 ? y * y / 16 + y : -y * y / 16 + y);
187 } 191 }
188 mouse_report->x = x; 192 mouse_report.x = x;
189 mouse_report->y = y; 193 mouse_report.y = y;
190 if (!layer_state_is(_MOUSE)) { 194 if (!layer_state_is(_MOUSE)) {
191 layer_on(_MOUSE); 195 layer_on(_MOUSE);
192 } 196 }
193 } 197 }
194 } 198 }
199 return mouse_report;
195} 200}
196 201
197void matrix_scan_keymap(void) { 202void matrix_scan_keymap(void) {
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk b/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk
index c9bc2dbb9..699e82648 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk
@@ -16,11 +16,11 @@ AUDIO_ENABLE = no # Audio output
16SWAP_HANDS_ENABLE = yes 16SWAP_HANDS_ENABLE = yes
17 17
18POINTING_DEVICE_ENABLE = yes 18POINTING_DEVICE_ENABLE = yes
19POINTING_DEVICE_DRIVER = pmw3360
19MOUSE_SHARED_EP = no 20MOUSE_SHARED_EP = no
20 21
21SPLIT_KEYBOARD = yes 22SPLIT_KEYBOARD = yes
22 23
23SRC += drivers/sensors/pmw3360.c 24QUANTUM_LIB_SRC += tm_sync.c
24QUANTUM_LIB_SRC += spi_master.c tm_sync.c
25 25
26DEFAULT_FOLDER = handwired/tractyl_manuform/5x6_right/teensy2pp 26DEFAULT_FOLDER = handwired/tractyl_manuform/5x6_right/teensy2pp
diff --git a/keyboards/handwired/tractyl_manuform/tm_sync.c b/keyboards/handwired/tractyl_manuform/tm_sync.c
index 1cb354946..4739af1e7 100644
--- a/keyboards/handwired/tractyl_manuform/tm_sync.c
+++ b/keyboards/handwired/tractyl_manuform/tm_sync.c
@@ -17,7 +17,6 @@
17#include "tractyl_manuform.h" 17#include "tractyl_manuform.h"
18#include "transactions.h" 18#include "transactions.h"
19#include <string.h> 19#include <string.h>
20#include "drivers/sensors/pmw3360.h"
21 20
22kb_config_data_t kb_config; 21kb_config_data_t kb_config;
23kb_mouse_report_t sync_mouse_report; 22kb_mouse_report_t sync_mouse_report;
@@ -82,6 +81,6 @@ void housekeeping_task_sync(void) {
82void trackball_set_cpi(uint16_t cpi) { 81void trackball_set_cpi(uint16_t cpi) {
83 kb_config.device_cpi = cpi; 82 kb_config.device_cpi = cpi;
84 if (!is_keyboard_left()) { 83 if (!is_keyboard_left()) {
85 pmw_set_cpi(cpi); 84 pointing_device_set_cpi(cpi);
86 } 85 }
87} 86}
diff --git a/keyboards/handwired/tractyl_manuform/tractyl_manuform.c b/keyboards/handwired/tractyl_manuform/tractyl_manuform.c
index d851528ff..5f476fcc9 100644
--- a/keyboards/handwired/tractyl_manuform/tractyl_manuform.c
+++ b/keyboards/handwired/tractyl_manuform/tractyl_manuform.c
@@ -34,55 +34,7 @@ keyboard_config_t keyboard_config;
34uint16_t dpi_array[] = TRACKBALL_DPI_OPTIONS; 34uint16_t dpi_array[] = TRACKBALL_DPI_OPTIONS;
35#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t)) 35#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t))
36 36
37bool BurstState = false; // init burst state for Trackball module
38uint16_t MotionStart = 0; // Timer for accel, 0 is resting state
39 37
40__attribute__((weak)) void process_mouse_user(report_mouse_t* mouse_report, int8_t x, int8_t y) {
41 mouse_report->x = x;
42 mouse_report->y = y;
43}
44
45__attribute__((weak)) void process_mouse(void) {
46 report_pmw_t data = pmw_read_burst();
47 // Reset timer if stopped moving
48 if (!data.isMotion) {
49 if (MotionStart != 0) MotionStart = 0;
50 return;
51 }
52
53 if (data.isOnSurface) {
54 // Set timer if new motion
55 if (MotionStart == 0) {
56 if (debug_mouse) dprintf("Starting motion.\n");
57 MotionStart = timer_read();
58 }
59
60 if (debug_mouse) {
61 dprintf("Delt] d: %d t: %u\n", abs(data.dx) + abs(data.dy), MotionStart);
62 }
63 if (debug_mouse) {
64 dprintf("Pre ] X: %d, Y: %d\n", data.dx, data.dy);
65 }
66#if defined(PROFILE_LINEAR)
67 float scale = float(timer_elaspsed(MotionStart)) / 1000.0;
68 data.dx *= scale;
69 data.dy *= scale;
70#elif defined(PROFILE_INVERSE)
71 // TODO
72#else
73 // no post processing
74#endif
75
76 // Wrap to HID size
77 data.dx = constrain(data.dx, -127, 127);
78 data.dy = constrain(data.dy, -127, 127);
79 if (debug_mouse) dprintf("Cons] X: %d, Y: %d\n", data.dx, data.dy);
80 // dprintf("Elapsed:%u, X: %f Y: %\n", i, pgm_read_byte(firmware_data+i));
81
82 sync_mouse_report.x = -data.dx;
83 sync_mouse_report.y = data.dy;
84 }
85}
86 38
87bool process_record_kb(uint16_t keycode, keyrecord_t* record) { 39bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
88 if (!process_record_user(keycode, record)) { 40 if (!process_record_user(keycode, record)) {
@@ -109,11 +61,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
109#ifndef MOUSEKEY_ENABLE 61#ifndef MOUSEKEY_ENABLE
110 if (IS_MOUSEKEY_BUTTON(keycode)) { 62 if (IS_MOUSEKEY_BUTTON(keycode)) {
111 report_mouse_t currentReport = pointing_device_get_report(); 63 report_mouse_t currentReport = pointing_device_get_report();
112 if (record->event.pressed) { 64 currentReport.buttons = pointing_device_handle_buttons(currentReport.buttons, record->event.pressed, keycode - KC_MS_BTN1);
113 currentReport.buttons |= 1 << (keycode - KC_MS_BTN1);
114 } else {
115 currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1));
116 }
117 pointing_device_set_report(currentReport); 65 pointing_device_set_report(currentReport);
118 pointing_device_send(); 66 pointing_device_send();
119 } 67 }
@@ -145,33 +93,28 @@ void keyboard_post_init_kb(void) {
145} 93}
146 94
147#ifdef POINTING_DEVICE_ENABLE 95#ifdef POINTING_DEVICE_ENABLE
148void pointing_device_init(void) { 96void pointing_device_init_kb(void) {
149 if (!is_keyboard_left()) {
150 // initialize ball sensor
151 pmw_spi_init();
152 }
153 trackball_set_cpi(dpi_array[keyboard_config.dpi_config]); 97 trackball_set_cpi(dpi_array[keyboard_config.dpi_config]);
98 pointing_device_init_user();
154} 99}
155 100
156void pointing_device_task(void) { 101report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
157 report_mouse_t mouse_report = pointing_device_get_report();
158
159 if (is_keyboard_left()) { 102 if (is_keyboard_left()) {
160 if (is_keyboard_master()) { 103 if (is_keyboard_master()) {
161 transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(sync_mouse_report), &sync_mouse_report); 104 transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(sync_mouse_report), &sync_mouse_report);
162 process_mouse_user(&mouse_report, sync_mouse_report.x, sync_mouse_report.y); 105 mouse_report.x = sync_mouse_report.x;
106 mouse_report.y = sync_mouse_report.y;
107 pointing_device_task_user(mouse_report);
163 } 108 }
164 } else { 109 } else {
165 process_mouse();
166 if (is_keyboard_master()) { 110 if (is_keyboard_master()) {
167 process_mouse_user(&mouse_report, sync_mouse_report.x, sync_mouse_report.y); 111 pointing_device_task_user(mouse_report);
168 sync_mouse_report.x = 0; 112 } else {
169 sync_mouse_report.y = 0; 113 sync_mouse_report.x = mouse_report.x;
114 sync_mouse_report.y = mouse_report.y;
170 } 115 }
171 } 116 }
172 117 return mouse_report;
173 pointing_device_set_report(mouse_report);
174 pointing_device_send();
175} 118}
176#endif 119#endif
177 120
diff --git a/keyboards/oddball/config.h b/keyboards/oddball/config.h
index 050084d2d..4bc9c7997 100644
--- a/keyboards/oddball/config.h
+++ b/keyboards/oddball/config.h
@@ -58,3 +58,6 @@
58/* Bootmagic Lite key configuration */ 58/* Bootmagic Lite key configuration */
59// #define BOOTMAGIC_LITE_ROW 0 59// #define BOOTMAGIC_LITE_ROW 0
60// #define BOOTMAGIC_LITE_COLUMN 0 60// #define BOOTMAGIC_LITE_COLUMN 0
61
62#define ADNS9800_CS_PIN SPI_SS_PIN
63#define PMW3360_CS_PIN SPI_SS_PIN
diff --git a/keyboards/oddball/keymaps/default/config.h b/keyboards/oddball/keymaps/default/config.h
deleted file mode 100644
index 7eddc070d..000000000
--- a/keyboards/oddball/keymaps/default/config.h
+++ /dev/null
@@ -1 +0,0 @@
1#define ADNS_9800
diff --git a/keyboards/oddball/keymaps/default/rules.mk b/keyboards/oddball/keymaps/default/rules.mk
new file mode 100644
index 000000000..84de35aeb
--- /dev/null
+++ b/keyboards/oddball/keymaps/default/rules.mk
@@ -0,0 +1 @@
POINTING_DEVICE_DRIVER = adns9800
diff --git a/keyboards/oddball/keymaps/pmw3360/config.h b/keyboards/oddball/keymaps/pmw3360/config.h
deleted file mode 100644
index f9af5f391..000000000
--- a/keyboards/oddball/keymaps/pmw3360/config.h
+++ /dev/null
@@ -1 +0,0 @@
1#define PMW_3360
diff --git a/keyboards/oddball/keymaps/pmw3360/rules.mk b/keyboards/oddball/keymaps/pmw3360/rules.mk
new file mode 100644
index 000000000..fab9162dc
--- /dev/null
+++ b/keyboards/oddball/keymaps/pmw3360/rules.mk
@@ -0,0 +1 @@
POINTING_DEVICE_DRIVER = pmw3360
diff --git a/keyboards/oddball/oddball.c b/keyboards/oddball/oddball.c
index 7ac6d9901..bbc3b3f2e 100644
--- a/keyboards/oddball/oddball.c
+++ b/keyboards/oddball/oddball.c
@@ -16,21 +16,17 @@
16 16
17#include "oddball.h" 17#include "oddball.h"
18#include "pointing_device.h" 18#include "pointing_device.h"
19#include "optical_sensor/optical_sensor.h" 19extern const pointing_device_driver_t pointing_device_driver;
20
21#define CLAMP_HID(value) value < -127 ? -127 : value > 127 ? 127 : value
22 20
23static bool scroll_pressed; 21static bool scroll_pressed;
24static bool mouse_buttons_dirty; 22static bool mouse_buttons_dirty;
25static int8_t scroll_h; 23static int8_t scroll_h;
26static int8_t scroll_v; 24static int8_t scroll_v;
27 25
28void pointing_device_init(void){ 26void pointing_device_init_kb(void){
29 if(!is_keyboard_master()) 27 if(!is_keyboard_master())
30 return; 28 return;
31 29
32 optical_sensor_init();
33
34 // read config from EEPROM and update if needed 30 // read config from EEPROM and update if needed
35 31
36 config_oddball_t kb_config; 32 config_oddball_t kb_config;
@@ -41,21 +37,17 @@ void pointing_device_init(void){
41 eeconfig_update_kb(kb_config.raw); 37 eeconfig_update_kb(kb_config.raw);
42 } 38 }
43 39
44 optical_sensor_set_config((config_optical_sensor_t){ kb_config.cpi }); 40 pointing_device_set_cpi(kb_config.cpi);
45} 41}
46 42
47void pointing_device_task(void){ 43report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
48 if(!is_keyboard_master()) 44 if (!is_keyboard_master()) return mouse_report;
49 return;
50
51 report_mouse_t mouse_report = pointing_device_get_report();
52 report_optical_sensor_t sensor_report = optical_sensor_get_report();
53
54 int8_t clamped_x = CLAMP_HID(sensor_report.x);
55 int8_t clamped_y = CLAMP_HID(sensor_report.y);
56 45
57 if(scroll_pressed) { 46 int8_t clamped_x = mouse_report.x, clamped_y = mouse_report.y;
47 mouse_report.x = 0;
48 mouse_report.y = 0;
58 49
50 if (scroll_pressed) {
59 // accumulate scroll 51 // accumulate scroll
60 scroll_h += clamped_x; 52 scroll_h += clamped_x;
61 scroll_v += clamped_y; 53 scroll_v += clamped_y;
@@ -65,33 +57,21 @@ void pointing_device_task(void){
65 57
66 // clear accumulated scroll on assignment 58 // clear accumulated scroll on assignment
67 59
68 if(scaled_scroll_h != 0){ 60 if (scaled_scroll_h != 0) {
69 mouse_report.h = -scaled_scroll_h; 61 mouse_report.h = -scaled_scroll_h;
70 scroll_h = 0; 62 scroll_h = 0;
71 } 63 }
72 64
73 if(scaled_scroll_v != 0){ 65 if (scaled_scroll_v != 0) {
74 mouse_report.v = -scaled_scroll_v; 66 mouse_report.v = -scaled_scroll_v;
75 scroll_v = 0; 67 scroll_v = 0;
76 } 68 }
77 } 69 } else {
78 else {
79 mouse_report.x = -clamped_x; 70 mouse_report.x = -clamped_x;
80 mouse_report.y = clamped_y; 71 mouse_report.y = clamped_y;
81 } 72 }
82 73
83 pointing_device_set_report(mouse_report); 74 return mouse_report;
84
85 // only send report on change as even sending report with no change is treated as movement
86 if(mouse_buttons_dirty ||
87 mouse_report.x != 0 ||
88 mouse_report.y != 0 ||
89 mouse_report.h != 0 ||
90 mouse_report.v != 0){
91
92 mouse_buttons_dirty = false;
93 pointing_device_send();
94 }
95} 75}
96 76
97static void on_cpi_button(uint16_t cpi, keyrecord_t *record) { 77static void on_cpi_button(uint16_t cpi, keyrecord_t *record) {
@@ -99,7 +79,7 @@ static void on_cpi_button(uint16_t cpi, keyrecord_t *record) {
99 if(!record->event.pressed) 79 if(!record->event.pressed)
100 return; 80 return;
101 81
102 optical_sensor_set_config((config_optical_sensor_t){ cpi }); 82 pointing_device_set_cpi(cpi);
103 83
104 config_oddball_t kb_config; 84 config_oddball_t kb_config;
105 kb_config.cpi = cpi; 85 kb_config.cpi = cpi;
@@ -165,5 +145,5 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
165 145
166 default: 146 default:
167 return true; 147 return true;
168 } 148 }
169} 149}
diff --git a/keyboards/oddball/optical_sensor/optical_sensor.h b/keyboards/oddball/optical_sensor/optical_sensor.h
deleted file mode 100644
index 00955209e..000000000
--- a/keyboards/oddball/optical_sensor/optical_sensor.h
+++ /dev/null
@@ -1,53 +0,0 @@
1/* Copyright 2020 Alexander Tulloh
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17/* common interface for opitcal sensors */
18
19#if defined ADNS_9800
20 #include "drivers/sensors/adns9800.h"
21 #define config_optical_sensor_t config_adns_t
22 #define report_optical_sensor_t report_adns_t
23 #define optical_sensor_init adns_init
24 #define optical_sensor_get_config adns_get_config
25 #define optical_sensor_set_config adns_set_config
26 #define optical_sensor_get_report adns_get_report
27#elif defined PMW_3360
28 #include "../pmw/pmw.h"
29 #define config_optical_sensor_t config_pmw_t
30 #define report_optical_sensor_t report_pmw_t
31 #define optical_sensor_init pmw_init
32 #define optical_sensor_get_config pmw_get_config
33 #define optical_sensor_set_config pmw_set_config
34 #define optical_sensor_get_report pmw_get_report
35#else
36 /* fallback stub */
37
38 #include <stdint.h>
39
40 typedef struct {
41 uint16_t cpi;
42 } config_optical_sensor_t;
43
44 typedef struct {
45 int16_t x;
46 int16_t y;
47 } report_optical_sensor_t;
48
49 #define optical_sensor_init(){ }
50 #define optical_sensor_get_config() (config_optical_sensor_t){ }
51 #define optical_sensor_set_config(config_optical_sensor_t){ }
52 #define optical_sensor_get_report() (report_optical_sensor_t){ }
53#endif
diff --git a/keyboards/oddball/pmw/pmw.c b/keyboards/oddball/pmw/pmw.c
deleted file mode 100644
index 51d692702..000000000
--- a/keyboards/oddball/pmw/pmw.c
+++ /dev/null
@@ -1,226 +0,0 @@
1/* Copyright 2020 Alexander Tulloh
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "spi_master.h"
18#include "quantum.h"
19#include "pmw3360_srom_0x04.h"
20#include "pmw.h"
21
22// registers
23#define Product_ID 0x00
24#define Revision_ID 0x01
25#define Motion 0x02
26#define Delta_X_L 0x03
27#define Delta_X_H 0x04
28#define Delta_Y_L 0x05
29#define Delta_Y_H 0x06
30#define SQUAL 0x07
31#define Raw_Data_Sum 0x08
32#define Maximum_Raw_data 0x09
33#define Minimum_Raw_data 0x0A
34#define Shutter_Lower 0x0B
35#define Shutter_Upper 0x0C
36#define Control 0x0D
37#define Config1 0x0F
38#define Config2 0x10
39#define Angle_Tune 0x11
40#define Frame_Capture 0x12
41#define SROM_Enable 0x13
42#define Run_Downshift 0x14
43#define Rest1_Rate_Lower 0x15
44#define Rest1_Rate_Upper 0x16
45#define Rest1_Downshift 0x17
46#define Rest2_Rate_Lower 0x18
47#define Rest2_Rate_Upper 0x19
48#define Rest2_Downshift 0x1A
49#define Rest3_Rate_Lower 0x1B
50#define Rest3_Rate_Upper 0x1C
51#define Observation 0x24
52#define Data_Out_Lower 0x25
53#define Data_Out_Upper 0x26
54#define Raw_Data_Dump 0x29
55#define SROM_ID 0x2A
56#define Min_SQ_Run 0x2B
57#define Raw_Data_Threshold 0x2C
58#define Config5 0x2F
59#define Power_Up_Reset 0x3A
60#define Shutdown 0x3B
61#define Inverse_Product_ID 0x3F
62#define LiftCutoff_Tune3 0x41
63#define Angle_Snap 0x42
64#define LiftCutoff_Tune1 0x4A
65#define Motion_Burst 0x50
66#define LiftCutoff_Tune_Timeout 0x58
67#define LiftCutoff_Tune_Min_Length 0x5A
68#define SROM_Load_Burst 0x62
69#define Lift_Config 0x63
70#define Raw_Data_Burst 0x64
71#define LiftCutoff_Tune2 0x65
72
73#define PMW_CLOCK_SPEED 70000000
74#define MIN_CPI 100
75#define MAX_CPI 12000
76#define CPI_STEP 100
77#define CLAMP_CPI(value) value < MIN_CPI ? MIN_CPI : value > MAX_CPI ? MAX_CPI : value
78#define SPI_MODE 3
79#define SPI_DIVISOR (F_CPU / PMW_CLOCK_SPEED)
80#define US_BETWEEN_WRITES 180
81#define US_BETWEEN_READS 20
82#define US_BEFORE_MOTION 35
83
84#define MSB1 0x80
85
86extern const uint16_t pmw_firmware_length;
87extern const uint8_t pmw_firmware_data[];
88
89void pmw_spi_start(void){
90 spi_start(SPI_SS_PIN, false, SPI_MODE, SPI_DIVISOR);
91}
92
93void pmw_write(uint8_t reg_addr, uint8_t data){
94
95 pmw_spi_start();
96 spi_write(reg_addr | MSB1 );
97 spi_write(data);
98 spi_stop();
99 wait_us(US_BETWEEN_WRITES);
100}
101
102uint8_t pmw_read(uint8_t reg_addr){
103
104 pmw_spi_start();
105 spi_write(reg_addr & 0x7f );
106 uint8_t data = spi_read();
107 spi_stop();
108 wait_us(US_BETWEEN_READS);
109
110 return data;
111}
112
113void pmw_init() {
114
115 setPinOutput(SPI_SS_PIN);
116
117 spi_init();
118
119 // reboot
120 pmw_write(Power_Up_Reset, 0x5a);
121 wait_ms(50);
122
123 // read registers and discard
124 pmw_read(Motion);
125 pmw_read(Delta_X_L);
126 pmw_read(Delta_X_H);
127 pmw_read(Delta_Y_L);
128 pmw_read(Delta_Y_H);
129
130 // upload firmware
131
132 // disable rest mode
133 pmw_write(Config2, 0x20);
134
135 // enable initialisation
136 pmw_write(SROM_Enable, 0x1d);
137
138 // wait a frame
139 wait_ms(10);
140
141 // start SROM download
142 pmw_write(SROM_Enable, 0x18);
143
144 // write the SROM file
145
146 pmw_spi_start();
147
148 spi_write(SROM_Load_Burst | 0x80);
149 wait_us(15);
150
151 // send all bytes of the firmware
152 unsigned char c;
153 for(int i = 0; i < pmw_firmware_length; i++){
154 c = (unsigned char)pgm_read_byte(pmw_firmware_data + i);
155 spi_write(c);
156 wait_us(15);
157 }
158
159 spi_stop();
160 wait_us(US_BETWEEN_WRITES);
161
162 // read id
163 pmw_read(SROM_ID);
164
165 // wired mouse
166 pmw_write(Config2, 0x00);
167
168 // first motion burst; write anything
169 pmw_write(Motion_Burst, 0xFF);
170 writePinLow(SPI_SS_PIN);
171}
172
173config_pmw_t pmw_get_config(void) {
174 uint8_t config_1 = pmw_read(Config1);
175 return (config_pmw_t){ (config_1 & 0xFF) * CPI_STEP };
176}
177
178void pmw_set_config(config_pmw_t config) {
179 uint8_t config_1 = (CLAMP_CPI(config.cpi) / CPI_STEP) & 0xFF;
180 pmw_write(Config1, config_1);
181}
182
183static int16_t convertDeltaToInt(uint8_t high, uint8_t low){
184
185 // join bytes into twos compliment
186 uint16_t twos_comp = (high << 8) | low;
187
188 // convert twos comp to int
189 if (twos_comp & 0x8000)
190 return -1 * (~twos_comp + 1);
191
192 return twos_comp;
193}
194
195report_pmw_t pmw_get_report(void) {
196
197 report_pmw_t report = {0, 0};
198
199 pmw_spi_start();
200
201 // start burst mode
202 spi_write(Motion_Burst & 0x7f);
203
204 wait_us(US_BEFORE_MOTION);
205
206 uint8_t motion = spi_read();
207
208 if(motion & 0x80) {
209
210 // clear observation register
211 spi_read();
212
213 // delta registers
214 uint8_t delta_x_l = spi_read();
215 uint8_t delta_x_h = spi_read();
216 uint8_t delta_y_l = spi_read();
217 uint8_t delta_y_h = spi_read();
218
219 report.x = convertDeltaToInt(delta_x_h, delta_x_l);
220 report.y = convertDeltaToInt(delta_y_h, delta_y_l);
221 }
222
223 spi_stop();
224
225 return report;
226}
diff --git a/keyboards/oddball/pmw/pmw3360_srom_0x04.h b/keyboards/oddball/pmw/pmw3360_srom_0x04.h
deleted file mode 100644
index 0dda4f1ab..000000000
--- a/keyboards/oddball/pmw/pmw3360_srom_0x04.h
+++ /dev/null
@@ -1,280 +0,0 @@
1#pragma once
2
3#include "progmem.h"
4
5const uint16_t pmw_firmware_length = 4094;
6
7const uint8_t pmw_firmware_data[] PROGMEM = {
80x01, 0x04, 0x8e, 0x96, 0x6e, 0x77, 0x3e, 0xfe, 0x7e, 0x5f, 0x1d, 0xb8, 0xf2, 0x66, 0x4e,
90xff, 0x5d, 0x19, 0xb0, 0xc2, 0x04, 0x69, 0x54, 0x2a, 0xd6, 0x2e, 0xbf, 0xdd, 0x19, 0xb0,
100xc3, 0xe5, 0x29, 0xb1, 0xe0, 0x23, 0xa5, 0xa9, 0xb1, 0xc1, 0x00, 0x82, 0x67, 0x4c, 0x1a,
110x97, 0x8d, 0x79, 0x51, 0x20, 0xc7, 0x06, 0x8e, 0x7c, 0x7c, 0x7a, 0x76, 0x4f, 0xfd, 0x59,
120x30, 0xe2, 0x46, 0x0e, 0x9e, 0xbe, 0xdf, 0x1d, 0x99, 0x91, 0xa0, 0xa5, 0xa1, 0xa9, 0xd0,
130x22, 0xc6, 0xef, 0x5c, 0x1b, 0x95, 0x89, 0x90, 0xa2, 0xa7, 0xcc, 0xfb, 0x55, 0x28, 0xb3,
140xe4, 0x4a, 0xf7, 0x6c, 0x3b, 0xf4, 0x6a, 0x56, 0x2e, 0xde, 0x1f, 0x9d, 0xb8, 0xd3, 0x05,
150x88, 0x92, 0xa6, 0xce, 0x1e, 0xbe, 0xdf, 0x1d, 0x99, 0xb0, 0xe2, 0x46, 0xef, 0x5c, 0x07,
160x11, 0x5d, 0x98, 0x0b, 0x9d, 0x94, 0x97, 0xee, 0x4e, 0x45, 0x33, 0x6b, 0x44, 0xc7, 0x29,
170x56, 0x27, 0x30, 0xc6, 0xa7, 0xd5, 0xf2, 0x56, 0xdf, 0xb4, 0x38, 0x62, 0xcb, 0xa0, 0xb6,
180xe3, 0x0f, 0x84, 0x06, 0x24, 0x05, 0x65, 0x6f, 0x76, 0x89, 0xb5, 0x77, 0x41, 0x27, 0x82,
190x66, 0x65, 0x82, 0xcc, 0xd5, 0xe6, 0x20, 0xd5, 0x27, 0x17, 0xc5, 0xf8, 0x03, 0x23, 0x7c,
200x5f, 0x64, 0xa5, 0x1d, 0xc1, 0xd6, 0x36, 0xcb, 0x4c, 0xd4, 0xdb, 0x66, 0xd7, 0x8b, 0xb1,
210x99, 0x7e, 0x6f, 0x4c, 0x36, 0x40, 0x06, 0xd6, 0xeb, 0xd7, 0xa2, 0xe4, 0xf4, 0x95, 0x51,
220x5a, 0x54, 0x96, 0xd5, 0x53, 0x44, 0xd7, 0x8c, 0xe0, 0xb9, 0x40, 0x68, 0xd2, 0x18, 0xe9,
230xdd, 0x9a, 0x23, 0x92, 0x48, 0xee, 0x7f, 0x43, 0xaf, 0xea, 0x77, 0x38, 0x84, 0x8c, 0x0a,
240x72, 0xaf, 0x69, 0xf8, 0xdd, 0xf1, 0x24, 0x83, 0xa3, 0xf8, 0x4a, 0xbf, 0xf5, 0x94, 0x13,
250xdb, 0xbb, 0xd8, 0xb4, 0xb3, 0xa0, 0xfb, 0x45, 0x50, 0x60, 0x30, 0x59, 0x12, 0x31, 0x71,
260xa2, 0xd3, 0x13, 0xe7, 0xfa, 0xe7, 0xce, 0x0f, 0x63, 0x15, 0x0b, 0x6b, 0x94, 0xbb, 0x37,
270x83, 0x26, 0x05, 0x9d, 0xfb, 0x46, 0x92, 0xfc, 0x0a, 0x15, 0xd1, 0x0d, 0x73, 0x92, 0xd6,
280x8c, 0x1b, 0x8c, 0xb8, 0x55, 0x8a, 0xce, 0xbd, 0xfe, 0x8e, 0xfc, 0xed, 0x09, 0x12, 0x83,
290x91, 0x82, 0x51, 0x31, 0x23, 0xfb, 0xb4, 0x0c, 0x76, 0xad, 0x7c, 0xd9, 0xb4, 0x4b, 0xb2,
300x67, 0x14, 0x09, 0x9c, 0x7f, 0x0c, 0x18, 0xba, 0x3b, 0xd6, 0x8e, 0x14, 0x2a, 0xe4, 0x1b,
310x52, 0x9f, 0x2b, 0x7d, 0xe1, 0xfb, 0x6a, 0x33, 0x02, 0xfa, 0xac, 0x5a, 0xf2, 0x3e, 0x88,
320x7e, 0xae, 0xd1, 0xf3, 0x78, 0xe8, 0x05, 0xd1, 0xe3, 0xdc, 0x21, 0xf6, 0xe1, 0x9a, 0xbd,
330x17, 0x0e, 0xd9, 0x46, 0x9b, 0x88, 0x03, 0xea, 0xf6, 0x66, 0xbe, 0x0e, 0x1b, 0x50, 0x49,
340x96, 0x40, 0x97, 0xf1, 0xf1, 0xe4, 0x80, 0xa6, 0x6e, 0xe8, 0x77, 0x34, 0xbf, 0x29, 0x40,
350x44, 0xc2, 0xff, 0x4e, 0x98, 0xd3, 0x9c, 0xa3, 0x32, 0x2b, 0x76, 0x51, 0x04, 0x09, 0xe7,
360xa9, 0xd1, 0xa6, 0x32, 0xb1, 0x23, 0x53, 0xe2, 0x47, 0xab, 0xd6, 0xf5, 0x69, 0x5c, 0x3e,
370x5f, 0xfa, 0xae, 0x45, 0x20, 0xe5, 0xd2, 0x44, 0xff, 0x39, 0x32, 0x6d, 0xfd, 0x27, 0x57,
380x5c, 0xfd, 0xf0, 0xde, 0xc1, 0xb5, 0x99, 0xe5, 0xf5, 0x1c, 0x77, 0x01, 0x75, 0xc5, 0x6d,
390x58, 0x92, 0xf2, 0xb2, 0x47, 0x00, 0x01, 0x26, 0x96, 0x7a, 0x30, 0xff, 0xb7, 0xf0, 0xef,
400x77, 0xc1, 0x8a, 0x5d, 0xdc, 0xc0, 0xd1, 0x29, 0x30, 0x1e, 0x77, 0x38, 0x7a, 0x94, 0xf1,
410xb8, 0x7a, 0x7e, 0xef, 0xa4, 0xd1, 0xac, 0x31, 0x4a, 0xf2, 0x5d, 0x64, 0x3d, 0xb2, 0xe2,
420xf0, 0x08, 0x99, 0xfc, 0x70, 0xee, 0x24, 0xa7, 0x7e, 0xee, 0x1e, 0x20, 0x69, 0x7d, 0x44,
430xbf, 0x87, 0x42, 0xdf, 0x88, 0x3b, 0x0c, 0xda, 0x42, 0xc9, 0x04, 0xf9, 0x45, 0x50, 0xfc,
440x83, 0x8f, 0x11, 0x6a, 0x72, 0xbc, 0x99, 0x95, 0xf0, 0xac, 0x3d, 0xa7, 0x3b, 0xcd, 0x1c,
450xe2, 0x88, 0x79, 0x37, 0x11, 0x5f, 0x39, 0x89, 0x95, 0x0a, 0x16, 0x84, 0x7a, 0xf6, 0x8a,
460xa4, 0x28, 0xe4, 0xed, 0x83, 0x80, 0x3b, 0xb1, 0x23, 0xa5, 0x03, 0x10, 0xf4, 0x66, 0xea,
470xbb, 0x0c, 0x0f, 0xc5, 0xec, 0x6c, 0x69, 0xc5, 0xd3, 0x24, 0xab, 0xd4, 0x2a, 0xb7, 0x99,
480x88, 0x76, 0x08, 0xa0, 0xa8, 0x95, 0x7c, 0xd8, 0x38, 0x6d, 0xcd, 0x59, 0x02, 0x51, 0x4b,
490xf1, 0xb5, 0x2b, 0x50, 0xe3, 0xb6, 0xbd, 0xd0, 0x72, 0xcf, 0x9e, 0xfd, 0x6e, 0xbb, 0x44,
500xc8, 0x24, 0x8a, 0x77, 0x18, 0x8a, 0x13, 0x06, 0xef, 0x97, 0x7d, 0xfa, 0x81, 0xf0, 0x31,
510xe6, 0xfa, 0x77, 0xed, 0x31, 0x06, 0x31, 0x5b, 0x54, 0x8a, 0x9f, 0x30, 0x68, 0xdb, 0xe2,
520x40, 0xf8, 0x4e, 0x73, 0xfa, 0xab, 0x74, 0x8b, 0x10, 0x58, 0x13, 0xdc, 0xd2, 0xe6, 0x78,
530xd1, 0x32, 0x2e, 0x8a, 0x9f, 0x2c, 0x58, 0x06, 0x48, 0x27, 0xc5, 0xa9, 0x5e, 0x81, 0x47,
540x89, 0x46, 0x21, 0x91, 0x03, 0x70, 0xa4, 0x3e, 0x88, 0x9c, 0xda, 0x33, 0x0a, 0xce, 0xbc,
550x8b, 0x8e, 0xcf, 0x9f, 0xd3, 0x71, 0x80, 0x43, 0xcf, 0x6b, 0xa9, 0x51, 0x83, 0x76, 0x30,
560x82, 0xc5, 0x6a, 0x85, 0x39, 0x11, 0x50, 0x1a, 0x82, 0xdc, 0x1e, 0x1c, 0xd5, 0x7d, 0xa9,
570x71, 0x99, 0x33, 0x47, 0x19, 0x97, 0xb3, 0x5a, 0xb1, 0xdf, 0xed, 0xa4, 0xf2, 0xe6, 0x26,
580x84, 0xa2, 0x28, 0x9a, 0x9e, 0xdf, 0xa6, 0x6a, 0xf4, 0xd6, 0xfc, 0x2e, 0x5b, 0x9d, 0x1a,
590x2a, 0x27, 0x68, 0xfb, 0xc1, 0x83, 0x21, 0x4b, 0x90, 0xe0, 0x36, 0xdd, 0x5b, 0x31, 0x42,
600x55, 0xa0, 0x13, 0xf7, 0xd0, 0x89, 0x53, 0x71, 0x99, 0x57, 0x09, 0x29, 0xc5, 0xf3, 0x21,
610xf8, 0x37, 0x2f, 0x40, 0xf3, 0xd4, 0xaf, 0x16, 0x08, 0x36, 0x02, 0xfc, 0x77, 0xc5, 0x8b,
620x04, 0x90, 0x56, 0xb9, 0xc9, 0x67, 0x9a, 0x99, 0xe8, 0x00, 0xd3, 0x86, 0xff, 0x97, 0x2d,
630x08, 0xe9, 0xb7, 0xb3, 0x91, 0xbc, 0xdf, 0x45, 0xc6, 0xed, 0x0f, 0x8c, 0x4c, 0x1e, 0xe6,
640x5b, 0x6e, 0x38, 0x30, 0xe4, 0xaa, 0xe3, 0x95, 0xde, 0xb9, 0xe4, 0x9a, 0xf5, 0xb2, 0x55,
650x9a, 0x87, 0x9b, 0xf6, 0x6a, 0xb2, 0xf2, 0x77, 0x9a, 0x31, 0xf4, 0x7a, 0x31, 0xd1, 0x1d,
660x04, 0xc0, 0x7c, 0x32, 0xa2, 0x9e, 0x9a, 0xf5, 0x62, 0xf8, 0x27, 0x8d, 0xbf, 0x51, 0xff,
670xd3, 0xdf, 0x64, 0x37, 0x3f, 0x2a, 0x6f, 0x76, 0x3a, 0x7d, 0x77, 0x06, 0x9e, 0x77, 0x7f,
680x5e, 0xeb, 0x32, 0x51, 0xf9, 0x16, 0x66, 0x9a, 0x09, 0xf3, 0xb0, 0x08, 0xa4, 0x70, 0x96,
690x46, 0x30, 0xff, 0xda, 0x4f, 0xe9, 0x1b, 0xed, 0x8d, 0xf8, 0x74, 0x1f, 0x31, 0x92, 0xb3,
700x73, 0x17, 0x36, 0xdb, 0x91, 0x30, 0xd6, 0x88, 0x55, 0x6b, 0x34, 0x77, 0x87, 0x7a, 0xe7,
710xee, 0x06, 0xc6, 0x1c, 0x8c, 0x19, 0x0c, 0x48, 0x46, 0x23, 0x5e, 0x9c, 0x07, 0x5c, 0xbf,
720xb4, 0x7e, 0xd6, 0x4f, 0x74, 0x9c, 0xe2, 0xc5, 0x50, 0x8b, 0xc5, 0x8b, 0x15, 0x90, 0x60,
730x62, 0x57, 0x29, 0xd0, 0x13, 0x43, 0xa1, 0x80, 0x88, 0x91, 0x00, 0x44, 0xc7, 0x4d, 0x19,
740x86, 0xcc, 0x2f, 0x2a, 0x75, 0x5a, 0xfc, 0xeb, 0x97, 0x2a, 0x70, 0xe3, 0x78, 0xd8, 0x91,
750xb0, 0x4f, 0x99, 0x07, 0xa3, 0x95, 0xea, 0x24, 0x21, 0xd5, 0xde, 0x51, 0x20, 0x93, 0x27,
760x0a, 0x30, 0x73, 0xa8, 0xff, 0x8a, 0x97, 0xe9, 0xa7, 0x6a, 0x8e, 0x0d, 0xe8, 0xf0, 0xdf,
770xec, 0xea, 0xb4, 0x6c, 0x1d, 0x39, 0x2a, 0x62, 0x2d, 0x3d, 0x5a, 0x8b, 0x65, 0xf8, 0x90,
780x05, 0x2e, 0x7e, 0x91, 0x2c, 0x78, 0xef, 0x8e, 0x7a, 0xc1, 0x2f, 0xac, 0x78, 0xee, 0xaf,
790x28, 0x45, 0x06, 0x4c, 0x26, 0xaf, 0x3b, 0xa2, 0xdb, 0xa3, 0x93, 0x06, 0xb5, 0x3c, 0xa5,
800xd8, 0xee, 0x8f, 0xaf, 0x25, 0xcc, 0x3f, 0x85, 0x68, 0x48, 0xa9, 0x62, 0xcc, 0x97, 0x8f,
810x7f, 0x2a, 0xea, 0xe0, 0x15, 0x0a, 0xad, 0x62, 0x07, 0xbd, 0x45, 0xf8, 0x41, 0xd8, 0x36,
820xcb, 0x4c, 0xdb, 0x6e, 0xe6, 0x3a, 0xe7, 0xda, 0x15, 0xe9, 0x29, 0x1e, 0x12, 0x10, 0xa0,
830x14, 0x2c, 0x0e, 0x3d, 0xf4, 0xbf, 0x39, 0x41, 0x92, 0x75, 0x0b, 0x25, 0x7b, 0xa3, 0xce,
840x39, 0x9c, 0x15, 0x64, 0xc8, 0xfa, 0x3d, 0xef, 0x73, 0x27, 0xfe, 0x26, 0x2e, 0xce, 0xda,
850x6e, 0xfd, 0x71, 0x8e, 0xdd, 0xfe, 0x76, 0xee, 0xdc, 0x12, 0x5c, 0x02, 0xc5, 0x3a, 0x4e,
860x4e, 0x4f, 0xbf, 0xca, 0x40, 0x15, 0xc7, 0x6e, 0x8d, 0x41, 0xf1, 0x10, 0xe0, 0x4f, 0x7e,
870x97, 0x7f, 0x1c, 0xae, 0x47, 0x8e, 0x6b, 0xb1, 0x25, 0x31, 0xb0, 0x73, 0xc7, 0x1b, 0x97,
880x79, 0xf9, 0x80, 0xd3, 0x66, 0x22, 0x30, 0x07, 0x74, 0x1e, 0xe4, 0xd0, 0x80, 0x21, 0xd6,
890xee, 0x6b, 0x6c, 0x4f, 0xbf, 0xf5, 0xb7, 0xd9, 0x09, 0x87, 0x2f, 0xa9, 0x14, 0xbe, 0x27,
900xd9, 0x72, 0x50, 0x01, 0xd4, 0x13, 0x73, 0xa6, 0xa7, 0x51, 0x02, 0x75, 0x25, 0xe1, 0xb3,
910x45, 0x34, 0x7d, 0xa8, 0x8e, 0xeb, 0xf3, 0x16, 0x49, 0xcb, 0x4f, 0x8c, 0xa1, 0xb9, 0x36,
920x85, 0x39, 0x75, 0x5d, 0x08, 0x00, 0xae, 0xeb, 0xf6, 0xea, 0xd7, 0x13, 0x3a, 0x21, 0x5a,
930x5f, 0x30, 0x84, 0x52, 0x26, 0x95, 0xc9, 0x14, 0xf2, 0x57, 0x55, 0x6b, 0xb1, 0x10, 0xc2,
940xe1, 0xbd, 0x3b, 0x51, 0xc0, 0xb7, 0x55, 0x4c, 0x71, 0x12, 0x26, 0xc7, 0x0d, 0xf9, 0x51,
950xa4, 0x38, 0x02, 0x05, 0x7f, 0xb8, 0xf1, 0x72, 0x4b, 0xbf, 0x71, 0x89, 0x14, 0xf3, 0x77,
960x38, 0xd9, 0x71, 0x24, 0xf3, 0x00, 0x11, 0xa1, 0xd8, 0xd4, 0x69, 0x27, 0x08, 0x37, 0x35,
970xc9, 0x11, 0x9d, 0x90, 0x1c, 0x0e, 0xe7, 0x1c, 0xff, 0x2d, 0x1e, 0xe8, 0x92, 0xe1, 0x18,
980x10, 0x95, 0x7c, 0xe0, 0x80, 0xf4, 0x96, 0x43, 0x21, 0xf9, 0x75, 0x21, 0x64, 0x38, 0xdd,
990x9f, 0x1e, 0x95, 0x16, 0xda, 0x56, 0x1d, 0x4f, 0x9a, 0x53, 0xb2, 0xe2, 0xe4, 0x18, 0xcb,
1000x6b, 0x1a, 0x65, 0xeb, 0x56, 0xc6, 0x3b, 0xe5, 0xfe, 0xd8, 0x26, 0x3f, 0x3a, 0x84, 0x59,
1010x72, 0x66, 0xa2, 0xf3, 0x75, 0xff, 0xfb, 0x60, 0xb3, 0x22, 0xad, 0x3f, 0x2d, 0x6b, 0xf9,
1020xeb, 0xea, 0x05, 0x7c, 0xd8, 0x8f, 0x6d, 0x2c, 0x98, 0x9e, 0x2b, 0x93, 0xf1, 0x5e, 0x46,
1030xf0, 0x87, 0x49, 0x29, 0x73, 0x68, 0xd7, 0x7f, 0xf9, 0xf0, 0xe5, 0x7d, 0xdb, 0x1d, 0x75,
1040x19, 0xf3, 0xc4, 0x58, 0x9b, 0x17, 0x88, 0xa8, 0x92, 0xe0, 0xbe, 0xbd, 0x8b, 0x1d, 0x8d,
1050x9f, 0x56, 0x76, 0xad, 0xaf, 0x29, 0xe2, 0xd9, 0xd5, 0x52, 0xf6, 0xb5, 0x56, 0x35, 0x57,
1060x3a, 0xc8, 0xe1, 0x56, 0x43, 0x19, 0x94, 0xd3, 0x04, 0x9b, 0x6d, 0x35, 0xd8, 0x0b, 0x5f,
1070x4d, 0x19, 0x8e, 0xec, 0xfa, 0x64, 0x91, 0x0a, 0x72, 0x20, 0x2b, 0xbc, 0x1a, 0x4a, 0xfe,
1080x8b, 0xfd, 0xbb, 0xed, 0x1b, 0x23, 0xea, 0xad, 0x72, 0x82, 0xa1, 0x29, 0x99, 0x71, 0xbd,
1090xf0, 0x95, 0xc1, 0x03, 0xdd, 0x7b, 0xc2, 0xb2, 0x3c, 0x28, 0x54, 0xd3, 0x68, 0xa4, 0x72,
1100xc8, 0x66, 0x96, 0xe0, 0xd1, 0xd8, 0x7f, 0xf8, 0xd1, 0x26, 0x2b, 0xf7, 0xad, 0xba, 0x55,
1110xca, 0x15, 0xb9, 0x32, 0xc3, 0xe5, 0x88, 0x97, 0x8e, 0x5c, 0xfb, 0x92, 0x25, 0x8b, 0xbf,
1120xa2, 0x45, 0x55, 0x7a, 0xa7, 0x6f, 0x8b, 0x57, 0x5b, 0xcf, 0x0e, 0xcb, 0x1d, 0xfb, 0x20,
1130x82, 0x77, 0xa8, 0x8c, 0xcc, 0x16, 0xce, 0x1d, 0xfa, 0xde, 0xcc, 0x0b, 0x62, 0xfe, 0xcc,
1140xe1, 0xb7, 0xf0, 0xc3, 0x81, 0x64, 0x73, 0x40, 0xa0, 0xc2, 0x4d, 0x89, 0x11, 0x75, 0x33,
1150x55, 0x33, 0x8d, 0xe8, 0x4a, 0xfd, 0xea, 0x6e, 0x30, 0x0b, 0xd7, 0x31, 0x2c, 0xde, 0x47,
1160xe3, 0xbf, 0xf8, 0x55, 0x42, 0xe2, 0x7f, 0x59, 0xe5, 0x17, 0xef, 0x99, 0x34, 0x69, 0x91,
1170xb1, 0x23, 0x8e, 0x20, 0x87, 0x2d, 0xa8, 0xfe, 0xd5, 0x8a, 0xf3, 0x84, 0x3a, 0xf0, 0x37,
1180xe4, 0x09, 0x00, 0x54, 0xee, 0x67, 0x49, 0x93, 0xe4, 0x81, 0x70, 0xe3, 0x90, 0x4d, 0xef,
1190xfe, 0x41, 0xb7, 0x99, 0x7b, 0xc1, 0x83, 0xba, 0x62, 0x12, 0x6f, 0x7d, 0xde, 0x6b, 0xaf,
1200xda, 0x16, 0xf9, 0x55, 0x51, 0xee, 0xa6, 0x0c, 0x2b, 0x02, 0xa3, 0xfd, 0x8d, 0xfb, 0x30,
1210x17, 0xe4, 0x6f, 0xdf, 0x36, 0x71, 0xc4, 0xca, 0x87, 0x25, 0x48, 0xb0, 0x47, 0xec, 0xea,
1220xb4, 0xbf, 0xa5, 0x4d, 0x9b, 0x9f, 0x02, 0x93, 0xc4, 0xe3, 0xe4, 0xe8, 0x42, 0x2d, 0x68,
1230x81, 0x15, 0x0a, 0xeb, 0x84, 0x5b, 0xd6, 0xa8, 0x74, 0xfb, 0x7d, 0x1d, 0xcb, 0x2c, 0xda,
1240x46, 0x2a, 0x76, 0x62, 0xce, 0xbc, 0x5c, 0x9e, 0x8b, 0xe7, 0xcf, 0xbe, 0x78, 0xf5, 0x7c,
1250xeb, 0xb3, 0x3a, 0x9c, 0xaa, 0x6f, 0xcc, 0x72, 0xd1, 0x59, 0xf2, 0x11, 0x23, 0xd6, 0x3f,
1260x48, 0xd1, 0xb7, 0xce, 0xb0, 0xbf, 0xcb, 0xea, 0x80, 0xde, 0x57, 0xd4, 0x5e, 0x97, 0x2f,
1270x75, 0xd1, 0x50, 0x8e, 0x80, 0x2c, 0x66, 0x79, 0xbf, 0x72, 0x4b, 0xbd, 0x8a, 0x81, 0x6c,
1280xd3, 0xe1, 0x01, 0xdc, 0xd2, 0x15, 0x26, 0xc5, 0x36, 0xda, 0x2c, 0x1a, 0xc0, 0x27, 0x94,
1290xed, 0xb7, 0x9b, 0x85, 0x0b, 0x5e, 0x80, 0x97, 0xc5, 0xec, 0x4f, 0xec, 0x88, 0x5d, 0x50,
1300x07, 0x35, 0x47, 0xdc, 0x0b, 0x3b, 0x3d, 0xdd, 0x60, 0xaf, 0xa8, 0x5d, 0x81, 0x38, 0x24,
1310x25, 0x5d, 0x5c, 0x15, 0xd1, 0xde, 0xb3, 0xab, 0xec, 0x05, 0x69, 0xef, 0x83, 0xed, 0x57,
1320x54, 0xb8, 0x64, 0x64, 0x11, 0x16, 0x32, 0x69, 0xda, 0x9f, 0x2d, 0x7f, 0x36, 0xbb, 0x44,
1330x5a, 0x34, 0xe8, 0x7f, 0xbf, 0x03, 0xeb, 0x00, 0x7f, 0x59, 0x68, 0x22, 0x79, 0xcf, 0x73,
1340x6c, 0x2c, 0x29, 0xa7, 0xa1, 0x5f, 0x38, 0xa1, 0x1d, 0xf0, 0x20, 0x53, 0xe0, 0x1a, 0x63,
1350x14, 0x58, 0x71, 0x10, 0xaa, 0x08, 0x0c, 0x3e, 0x16, 0x1a, 0x60, 0x22, 0x82, 0x7f, 0xba,
1360xa4, 0x43, 0xa0, 0xd0, 0xac, 0x1b, 0xd5, 0x6b, 0x64, 0xb5, 0x14, 0x93, 0x31, 0x9e, 0x53,
1370x50, 0xd0, 0x57, 0x66, 0xee, 0x5a, 0x4f, 0xfb, 0x03, 0x2a, 0x69, 0x58, 0x76, 0xf1, 0x83,
1380xf7, 0x4e, 0xba, 0x8c, 0x42, 0x06, 0x60, 0x5d, 0x6d, 0xce, 0x60, 0x88, 0xae, 0xa4, 0xc3,
1390xf1, 0x03, 0xa5, 0x4b, 0x98, 0xa1, 0xff, 0x67, 0xe1, 0xac, 0xa2, 0xb8, 0x62, 0xd7, 0x6f,
1400xa0, 0x31, 0xb4, 0xd2, 0x77, 0xaf, 0x21, 0x10, 0x06, 0xc6, 0x9a, 0xff, 0x1d, 0x09, 0x17,
1410x0e, 0x5f, 0xf1, 0xaa, 0x54, 0x34, 0x4b, 0x45, 0x8a, 0x87, 0x63, 0xa6, 0xdc, 0xf9, 0x24,
1420x30, 0x67, 0xc6, 0xb2, 0xd6, 0x61, 0x33, 0x69, 0xee, 0x50, 0x61, 0x57, 0x28, 0xe7, 0x7e,
1430xee, 0xec, 0x3a, 0x5a, 0x73, 0x4e, 0xa8, 0x8d, 0xe4, 0x18, 0xea, 0xec, 0x41, 0x64, 0xc8,
1440xe2, 0xe8, 0x66, 0xb6, 0x2d, 0xb6, 0xfb, 0x6a, 0x6c, 0x16, 0xb3, 0xdd, 0x46, 0x43, 0xb9,
1450x73, 0x00, 0x6a, 0x71, 0xed, 0x4e, 0x9d, 0x25, 0x1a, 0xc3, 0x3c, 0x4a, 0x95, 0x15, 0x99,
1460x35, 0x81, 0x14, 0x02, 0xd6, 0x98, 0x9b, 0xec, 0xd8, 0x23, 0x3b, 0x84, 0x29, 0xaf, 0x0c,
1470x99, 0x83, 0xa6, 0x9a, 0x34, 0x4f, 0xfa, 0xe8, 0xd0, 0x3c, 0x4b, 0xd0, 0xfb, 0xb6, 0x68,
1480xb8, 0x9e, 0x8f, 0xcd, 0xf7, 0x60, 0x2d, 0x7a, 0x22, 0xe5, 0x7d, 0xab, 0x65, 0x1b, 0x95,
1490xa7, 0xa8, 0x7f, 0xb6, 0x77, 0x47, 0x7b, 0x5f, 0x8b, 0x12, 0x72, 0xd0, 0xd4, 0x91, 0xef,
1500xde, 0x19, 0x50, 0x3c, 0xa7, 0x8b, 0xc4, 0xa9, 0xb3, 0x23, 0xcb, 0x76, 0xe6, 0x81, 0xf0,
1510xc1, 0x04, 0x8f, 0xa3, 0xb8, 0x54, 0x5b, 0x97, 0xac, 0x19, 0xff, 0x3f, 0x55, 0x27, 0x2f,
1520xe0, 0x1d, 0x42, 0x9b, 0x57, 0xfc, 0x4b, 0x4e, 0x0f, 0xce, 0x98, 0xa9, 0x43, 0x57, 0x03,
1530xbd, 0xe7, 0xc8, 0x94, 0xdf, 0x6e, 0x36, 0x73, 0x32, 0xb4, 0xef, 0x2e, 0x85, 0x7a, 0x6e,
1540xfc, 0x6c, 0x18, 0x82, 0x75, 0x35, 0x90, 0x07, 0xf3, 0xe4, 0x9f, 0x3e, 0xdc, 0x68, 0xf3,
1550xb5, 0xf3, 0x19, 0x80, 0x92, 0x06, 0x99, 0xa2, 0xe8, 0x6f, 0xff, 0x2e, 0x7f, 0xae, 0x42,
1560xa4, 0x5f, 0xfb, 0xd4, 0x0e, 0x81, 0x2b, 0xc3, 0x04, 0xff, 0x2b, 0xb3, 0x74, 0x4e, 0x36,
1570x5b, 0x9c, 0x15, 0x00, 0xc6, 0x47, 0x2b, 0xe8, 0x8b, 0x3d, 0xf1, 0x9c, 0x03, 0x9a, 0x58,
1580x7f, 0x9b, 0x9c, 0xbf, 0x85, 0x49, 0x79, 0x35, 0x2e, 0x56, 0x7b, 0x41, 0x14, 0x39, 0x47,
1590x83, 0x26, 0xaa, 0x07, 0x89, 0x98, 0x11, 0x1b, 0x86, 0xe7, 0x73, 0x7a, 0xd8, 0x7d, 0x78,
1600x61, 0x53, 0xe9, 0x79, 0xf5, 0x36, 0x8d, 0x44, 0x92, 0x84, 0xf9, 0x13, 0x50, 0x58, 0x3b,
1610xa4, 0x6a, 0x36, 0x65, 0x49, 0x8e, 0x3c, 0x0e, 0xf1, 0x6f, 0xd2, 0x84, 0xc4, 0x7e, 0x8e,
1620x3f, 0x39, 0xae, 0x7c, 0x84, 0xf1, 0x63, 0x37, 0x8e, 0x3c, 0xcc, 0x3e, 0x44, 0x81, 0x45,
1630xf1, 0x4b, 0xb9, 0xed, 0x6b, 0x36, 0x5d, 0xbb, 0x20, 0x60, 0x1a, 0x0f, 0xa3, 0xaa, 0x55,
1640x77, 0x3a, 0xa9, 0xae, 0x37, 0x4d, 0xba, 0xb8, 0x86, 0x6b, 0xbc, 0x08, 0x50, 0xf6, 0xcc,
1650xa4, 0xbd, 0x1d, 0x40, 0x72, 0xa5, 0x86, 0xfa, 0xe2, 0x10, 0xae, 0x3d, 0x58, 0x4b, 0x97,
1660xf3, 0x43, 0x74, 0xa9, 0x9e, 0xeb, 0x21, 0xb7, 0x01, 0xa4, 0x86, 0x93, 0x97, 0xee, 0x2f,
1670x4f, 0x3b, 0x86, 0xa1, 0x41, 0x6f, 0x41, 0x26, 0x90, 0x78, 0x5c, 0x7f, 0x30, 0x38, 0x4b,
1680x3f, 0xaa, 0xec, 0xed, 0x5c, 0x6f, 0x0e, 0xad, 0x43, 0x87, 0xfd, 0x93, 0x35, 0xe6, 0x01,
1690xef, 0x41, 0x26, 0x90, 0x99, 0x9e, 0xfb, 0x19, 0x5b, 0xad, 0xd2, 0x91, 0x8a, 0xe0, 0x46,
1700xaf, 0x65, 0xfa, 0x4f, 0x84, 0xc1, 0xa1, 0x2d, 0xcf, 0x45, 0x8b, 0xd3, 0x85, 0x50, 0x55,
1710x7c, 0xf9, 0x67, 0x88, 0xd4, 0x4e, 0xe9, 0xd7, 0x6b, 0x61, 0x54, 0xa1, 0xa4, 0xa6, 0xa2,
1720xc2, 0xbf, 0x30, 0x9c, 0x40, 0x9f, 0x5f, 0xd7, 0x69, 0x2b, 0x24, 0x82, 0x5e, 0xd9, 0xd6,
1730xa7, 0x12, 0x54, 0x1a, 0xf7, 0x55, 0x9f, 0x76, 0x50, 0xa9, 0x95, 0x84, 0xe6, 0x6b, 0x6d,
1740xb5, 0x96, 0x54, 0xd6, 0xcd, 0xb3, 0xa1, 0x9b, 0x46, 0xa7, 0x94, 0x4d, 0xc4, 0x94, 0xb4,
1750x98, 0xe3, 0xe1, 0xe2, 0x34, 0xd5, 0x33, 0x16, 0x07, 0x54, 0xcd, 0xb7, 0x77, 0x53, 0xdb,
1760x4f, 0x4d, 0x46, 0x9d, 0xe9, 0xd4, 0x9c, 0x8a, 0x36, 0xb6, 0xb8, 0x38, 0x26, 0x6c, 0x0e,
1770xff, 0x9c, 0x1b, 0x43, 0x8b, 0x80, 0xcc, 0xb9, 0x3d, 0xda, 0xc7, 0xf1, 0x8a, 0xf2, 0x6d,
1780xb8, 0xd7, 0x74, 0x2f, 0x7e, 0x1e, 0xb7, 0xd3, 0x4a, 0xb4, 0xac, 0xfc, 0x79, 0x48, 0x6c,
1790xbc, 0x96, 0xb6, 0x94, 0x46, 0x57, 0x2d, 0xb0, 0xa3, 0xfc, 0x1e, 0xb9, 0x52, 0x60, 0x85,
1800x2d, 0x41, 0xd0, 0x43, 0x01, 0x1e, 0x1c, 0xd5, 0x7d, 0xfc, 0xf3, 0x96, 0x0d, 0xc7, 0xcb,
1810x2a, 0x29, 0x9a, 0x93, 0xdd, 0x88, 0x2d, 0x37, 0x5d, 0xaa, 0xfb, 0x49, 0x68, 0xa0, 0x9c,
1820x50, 0x86, 0x7f, 0x68, 0x56, 0x57, 0xf9, 0x79, 0x18, 0x39, 0xd4, 0xe0, 0x01, 0x84, 0x33,
1830x61, 0xca, 0xa5, 0xd2, 0xd6, 0xe4, 0xc9, 0x8a, 0x4a, 0x23, 0x44, 0x4e, 0xbc, 0xf0, 0xdc,
1840x24, 0xa1, 0xa0, 0xc4, 0xe2, 0x07, 0x3c, 0x10, 0xc4, 0xb5, 0x25, 0x4b, 0x65, 0x63, 0xf4,
1850x80, 0xe7, 0xcf, 0x61, 0xb1, 0x71, 0x82, 0x21, 0x87, 0x2c, 0xf5, 0x91, 0x00, 0x32, 0x0c,
1860xec, 0xa9, 0xb5, 0x9a, 0x74, 0x85, 0xe3, 0x36, 0x8f, 0x76, 0x4f, 0x9c, 0x6d, 0xce, 0xbc,
1870xad, 0x0a, 0x4b, 0xed, 0x76, 0x04, 0xcb, 0xc3, 0xb9, 0x33, 0x9e, 0x01, 0x93, 0x96, 0x69,
1880x7d, 0xc5, 0xa2, 0x45, 0x79, 0x9b, 0x04, 0x5c, 0x84, 0x09, 0xed, 0x88, 0x43, 0xc7, 0xab,
1890x93, 0x14, 0x26, 0xa1, 0x40, 0xb5, 0xce, 0x4e, 0xbf, 0x2a, 0x42, 0x85, 0x3e, 0x2c, 0x3b,
1900x54, 0xe8, 0x12, 0x1f, 0x0e, 0x97, 0x59, 0xb2, 0x27, 0x89, 0xfa, 0xf2, 0xdf, 0x8e, 0x68,
1910x59, 0xdc, 0x06, 0xbc, 0xb6, 0x85, 0x0d, 0x06, 0x22, 0xec, 0xb1, 0xcb, 0xe5, 0x04, 0xe6,
1920x3d, 0xb3, 0xb0, 0x41, 0x73, 0x08, 0x3f, 0x3c, 0x58, 0x86, 0x63, 0xeb, 0x50, 0xee, 0x1d,
1930x2c, 0x37, 0x74, 0xa9, 0xd3, 0x18, 0xa3, 0x47, 0x6e, 0x93, 0x54, 0xad, 0x0a, 0x5d, 0xb8,
1940x2a, 0x55, 0x5d, 0x78, 0xf6, 0xee, 0xbe, 0x8e, 0x3c, 0x76, 0x69, 0xb9, 0x40, 0xc2, 0x34,
1950xec, 0x2a, 0xb9, 0xed, 0x7e, 0x20, 0xe4, 0x8d, 0x00, 0x38, 0xc7, 0xe6, 0x8f, 0x44, 0xa8,
1960x86, 0xce, 0xeb, 0x2a, 0xe9, 0x90, 0xf1, 0x4c, 0xdf, 0x32, 0xfb, 0x73, 0x1b, 0x6d, 0x92,
1970x1e, 0x95, 0xfe, 0xb4, 0xdb, 0x65, 0xdf, 0x4d, 0x23, 0x54, 0x89, 0x48, 0xbf, 0x4a, 0x2e,
1980x70, 0xd6, 0xd7, 0x62, 0xb4, 0x33, 0x29, 0xb1, 0x3a, 0x33, 0x4c, 0x23, 0x6d, 0xa6, 0x76,
1990xa5, 0x21, 0x63, 0x48, 0xe6, 0x90, 0x5d, 0xed, 0x90, 0x95, 0x0b, 0x7a, 0x84, 0xbe, 0xb8,
2000x0d, 0x5e, 0x63, 0x0c, 0x62, 0x26, 0x4c, 0x14, 0x5a, 0xb3, 0xac, 0x23, 0xa4, 0x74, 0xa7,
2010x6f, 0x33, 0x30, 0x05, 0x60, 0x01, 0x42, 0xa0, 0x28, 0xb7, 0xee, 0x19, 0x38, 0xf1, 0x64,
2020x80, 0x82, 0x43, 0xe1, 0x41, 0x27, 0x1f, 0x1f, 0x90, 0x54, 0x7a, 0xd5, 0x23, 0x2e, 0xd1,
2030x3d, 0xcb, 0x28, 0xba, 0x58, 0x7f, 0xdc, 0x7c, 0x91, 0x24, 0xe9, 0x28, 0x51, 0x83, 0x6e,
2040xc5, 0x56, 0x21, 0x42, 0xed, 0xa0, 0x56, 0x22, 0xa1, 0x40, 0x80, 0x6b, 0xa8, 0xf7, 0x94,
2050xca, 0x13, 0x6b, 0x0c, 0x39, 0xd9, 0xfd, 0xe9, 0xf3, 0x6f, 0xa6, 0x9e, 0xfc, 0x70, 0x8a,
2060xb3, 0xbc, 0x59, 0x3c, 0x1e, 0x1d, 0x6c, 0xf9, 0x7c, 0xaf, 0xf9, 0x88, 0x71, 0x95, 0xeb,
2070x57, 0x00, 0xbd, 0x9f, 0x8c, 0x4f, 0xe1, 0x24, 0x83, 0xc5, 0x22, 0xea, 0xfd, 0xd3, 0x0c,
2080xe2, 0x17, 0x18, 0x7c, 0x6a, 0x4c, 0xde, 0x77, 0xb4, 0x53, 0x9b, 0x4c, 0x81, 0xcd, 0x23,
2090x60, 0xaa, 0x0e, 0x25, 0x73, 0x9c, 0x02, 0x79, 0x32, 0x30, 0xdf, 0x74, 0xdf, 0x75, 0x19,
2100xf4, 0xa5, 0x14, 0x5c, 0xf7, 0x7a, 0xa8, 0xa5, 0x91, 0x84, 0x7c, 0x60, 0x03, 0x06, 0x3b,
2110xcd, 0x50, 0xb6, 0x27, 0x9c, 0xfe, 0xb1, 0xdd, 0xcc, 0xd3, 0xb0, 0x59, 0x24, 0xb2, 0xca,
2120xe2, 0x1c, 0x81, 0x22, 0x9d, 0x07, 0x8f, 0x8e, 0xb9, 0xbe, 0x4e, 0xfa, 0xfc, 0x39, 0x65,
2130xba, 0xbf, 0x9d, 0x12, 0x37, 0x5e, 0x97, 0x7e, 0xf3, 0x89, 0xf5, 0x5d, 0xf5, 0xe3, 0x09,
2140x8c, 0x62, 0xb5, 0x20, 0x9d, 0x0c, 0x53, 0x8a, 0x68, 0x1b, 0xd2, 0x8f, 0x75, 0x17, 0x5d,
2150xd4, 0xe5, 0xda, 0x75, 0x62, 0x19, 0x14, 0x6a, 0x26, 0x2d, 0xeb, 0xf8, 0xaf, 0x37, 0xf0,
2160x6c, 0xa4, 0x55, 0xb1, 0xbc, 0xe2, 0x33, 0xc0, 0x9a, 0xca, 0xb0, 0x11, 0x49, 0x4f, 0x68,
2170x9b, 0x3b, 0x6b, 0x3c, 0xcc, 0x13, 0xf6, 0xc7, 0x85, 0x61, 0x68, 0x42, 0xae, 0xbb, 0xdd,
2180xcd, 0x45, 0x16, 0x29, 0x1d, 0xea, 0xdb, 0xc8, 0x03, 0x94, 0x3c, 0xee, 0x4f, 0x82, 0x11,
2190xc3, 0xec, 0x28, 0xbd, 0x97, 0x05, 0x99, 0xde, 0xd7, 0xbb, 0x5e, 0x22, 0x1f, 0xd4, 0xeb,
2200x64, 0xd9, 0x92, 0xd9, 0x85, 0xb7, 0x6a, 0x05, 0x6a, 0xe4, 0x24, 0x41, 0xf1, 0xcd, 0xf0,
2210xd8, 0x3f, 0xf8, 0x9e, 0x0e, 0xcd, 0x0b, 0x7a, 0x70, 0x6b, 0x5a, 0x75, 0x0a, 0x6a, 0x33,
2220x88, 0xec, 0x17, 0x75, 0x08, 0x70, 0x10, 0x2f, 0x24, 0xcf, 0xc4, 0xe9, 0x42, 0x00, 0x61,
2230x94, 0xca, 0x1f, 0x3a, 0x76, 0x06, 0xfa, 0xd2, 0x48, 0x81, 0xf0, 0x77, 0x60, 0x03, 0x45,
2240xd9, 0x61, 0xf4, 0xa4, 0x6f, 0x3d, 0xd9, 0x30, 0xc3, 0x04, 0x6b, 0x54, 0x2a, 0xb7, 0xec,
2250x3b, 0xf4, 0x4b, 0xf5, 0x68, 0x52, 0x26, 0xce, 0xff, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xa5,
2260xa9, 0xb1, 0xe0, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0xf9, 0x51, 0x20, 0xa3, 0xa5, 0xa9, 0xb1,
2270xc1, 0x00, 0x82, 0x86, 0x8e, 0x7f, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xc4, 0xeb, 0x54, 0x0b,
2280x75, 0x68, 0x52, 0x07, 0x8c, 0x9a, 0x97, 0x8d, 0x79, 0x70, 0x62, 0x46, 0xef, 0x5c, 0x1b,
2290x95, 0x89, 0x71, 0x41, 0xe1, 0x21, 0xa1, 0xa1, 0xa1, 0xc0, 0x02, 0x67, 0x4c, 0x1a, 0xb6,
2300xcf, 0xfd, 0x78, 0x53, 0x24, 0xab, 0xb5, 0xc9, 0xf1, 0x60, 0x23, 0xa5, 0xc8, 0x12, 0x87,
2310x6d, 0x58, 0x13, 0x85, 0x88, 0x92, 0x87, 0x6d, 0x58, 0x32, 0xc7, 0x0c, 0x9a, 0x97, 0xac,
2320xda, 0x36, 0xee, 0x5e, 0x3e, 0xdf, 0x1d, 0xb8, 0xf2, 0x66, 0x2f, 0xbd, 0xf8, 0x72, 0x47,
2330xed, 0x58, 0x13, 0x85, 0x88, 0x92, 0x87, 0x8c, 0x7b, 0x55, 0x09, 0x90, 0xa2, 0xc6, 0xef,
2340x3d, 0xf8, 0x53, 0x24, 0xab, 0xd4, 0x2a, 0xb7, 0xec, 0x5a, 0x36, 0xee, 0x5e, 0x3e, 0xdf,
2350x3c, 0xfa, 0x76, 0x4f, 0xfd, 0x59, 0x30, 0xe2, 0x46, 0xef, 0x3d, 0xf8, 0x53, 0x05, 0x69,
2360x31, 0xc1, 0x00, 0x82, 0x86, 0x8e, 0x7f, 0x5d, 0x19, 0xb0, 0xe2, 0x27, 0xcc, 0xfb, 0x74,
2370x4b, 0x14, 0x8b, 0x94, 0x8b, 0x75, 0x68, 0x33, 0xc5, 0x08, 0x92, 0x87, 0x8c, 0x9a, 0xb6,
2380xcf, 0x1c, 0xba, 0xd7, 0x0d, 0x98, 0xb2, 0xe6, 0x2f, 0xdc, 0x1b, 0x95, 0x89, 0x71, 0x60,
2390x23, 0xc4, 0x0a, 0x96, 0x8f, 0x9c, 0xba, 0xf6, 0x6e, 0x3f, 0xfc, 0x5b, 0x15, 0xa8, 0xd2,
2400x26, 0xaf, 0xbd, 0xf8, 0x72, 0x66, 0x2f, 0xdc, 0x1b, 0xb4, 0xcb, 0x14, 0x8b, 0x94, 0xaa,
2410xb7, 0xcd, 0xf9, 0x51, 0x01, 0x80, 0x82, 0x86, 0x6f, 0x3d, 0xd9, 0x30, 0xe2, 0x27, 0xcc,
2420xfb, 0x74, 0x4b, 0x14, 0xaa, 0xb7, 0xcd, 0xf9, 0x70, 0x43, 0x04, 0x6b, 0x35, 0xc9, 0xf1,
2430x60, 0x23, 0xa5, 0xc8, 0xf3, 0x45, 0x08, 0x92, 0x87, 0x6d, 0x58, 0x32, 0xe6, 0x2f, 0xbd,
2440xf8, 0x72, 0x66, 0x4e, 0x1e, 0xbe, 0xfe, 0x7e, 0x7e, 0x7e, 0x5f, 0x1d, 0x99, 0x91, 0xa0,
2450xa3, 0xc4, 0x0a, 0x77, 0x4d, 0x18, 0x93, 0xa4, 0xab, 0xd4, 0x0b, 0x75, 0x49, 0x10, 0xa2,
2460xc6, 0xef, 0x3d, 0xf8, 0x53, 0x24, 0xab, 0xb5, 0xe8, 0x33, 0xe4, 0x4a, 0x16, 0xae, 0xde,
2470x1f, 0xbc, 0xdb, 0x15, 0xa8, 0xb3, 0xc5, 0x08, 0x73, 0x45, 0xe9, 0x31, 0xc1, 0xe1, 0x21,
2480xa1, 0xa1, 0xa1, 0xc0, 0x02, 0x86, 0x6f, 0x5c, 0x3a, 0xd7, 0x0d, 0x98, 0x93, 0xa4, 0xca,
2490x16, 0xae, 0xde, 0x1f, 0x9d, 0x99, 0xb0, 0xe2, 0x46, 0xef, 0x3d, 0xf8, 0x72, 0x47, 0x0c,
2500x9a, 0xb6, 0xcf, 0xfd, 0x59, 0x11, 0xa0, 0xa3, 0xa5, 0xc8, 0xf3, 0x45, 0x08, 0x92, 0x87,
2510x6d, 0x39, 0xf0, 0x43, 0x04, 0x8a, 0x96, 0xae, 0xde, 0x3e, 0xdf, 0x1d, 0x99, 0x91, 0xa0,
2520xc2, 0x06, 0x6f, 0x3d, 0xf8, 0x72, 0x47, 0x0c, 0x9a, 0x97, 0x8d, 0x98, 0x93, 0x85, 0x88,
2530x73, 0x45, 0xe9, 0x31, 0xe0, 0x23, 0xa5, 0xa9, 0xd0, 0x03, 0x84, 0x8a, 0x96, 0xae, 0xde,
2540x1f, 0xbc, 0xdb, 0x15, 0xa8, 0xd2, 0x26, 0xce, 0xff, 0x5d, 0x19, 0x91, 0x81, 0x80, 0x82,
2550x67, 0x2d, 0xd8, 0x13, 0xa4, 0xab, 0xd4, 0x0b, 0x94, 0xaa, 0xb7, 0xcd, 0xf9, 0x51, 0x20,
2560xa3, 0xa5, 0xc8, 0xf3, 0x45, 0xe9, 0x50, 0x22, 0xc6, 0xef, 0x5c, 0x3a, 0xd7, 0x0d, 0x98,
2570x93, 0x85, 0x88, 0x73, 0x64, 0x4a, 0xf7, 0x4d, 0xf9, 0x51, 0x20, 0xa3, 0xc4, 0x0a, 0x96,
2580xae, 0xde, 0x3e, 0xfe, 0x7e, 0x7e, 0x7e, 0x5f, 0x3c, 0xfa, 0x76, 0x4f, 0xfd, 0x78, 0x72,
2590x66, 0x2f, 0xbd, 0xd9, 0x30, 0xc3, 0xe5, 0x48, 0x12, 0x87, 0x8c, 0x7b, 0x55, 0x28, 0xd2,
2600x07, 0x8c, 0x9a, 0x97, 0xac, 0xda, 0x17, 0x8d, 0x79, 0x51, 0x20, 0xa3, 0xc4, 0xeb, 0x54,
2610x0b, 0x94, 0x8b, 0x94, 0xaa, 0xd6, 0x2e, 0xbf, 0xfc, 0x5b, 0x15, 0xa8, 0xd2, 0x26, 0xaf,
2620xdc, 0x1b, 0xb4, 0xea, 0x37, 0xec, 0x3b, 0xf4, 0x6a, 0x37, 0xcd, 0x18, 0x93, 0x85, 0x69,
2630x31, 0xc1, 0xe1, 0x40, 0xe3, 0x25, 0xc8, 0x12, 0x87, 0x8c, 0x9a, 0xb6, 0xcf, 0xfd, 0x59,
2640x11, 0xa0, 0xc2, 0x06, 0x8e, 0x7f, 0x5d, 0x38, 0xf2, 0x47, 0x0c, 0x7b, 0x74, 0x6a, 0x37,
2650xec, 0x5a, 0x36, 0xee, 0x3f, 0xfc, 0x7a, 0x76, 0x4f, 0x1c, 0x9b, 0x95, 0x89, 0x71, 0x41,
2660x00, 0x63, 0x44, 0xeb, 0x54, 0x2a, 0xd6, 0x0f, 0x9c, 0xba, 0xd7, 0x0d, 0x98, 0x93, 0x85,
2670x69, 0x31, 0xc1, 0x00, 0x82, 0x86, 0x8e, 0x9e, 0xbe, 0xdf, 0x3c, 0xfa, 0x57, 0x2c, 0xda,
2680x36, 0xee, 0x3f, 0xfc, 0x5b, 0x15, 0x89, 0x71, 0x41, 0x00, 0x82, 0x86, 0x8e, 0x7f, 0x5d,
2690x38, 0xf2, 0x47, 0xed, 0x58, 0x13, 0xa4, 0xca, 0xf7, 0x4d, 0xf9, 0x51, 0x01, 0x80, 0x63,
2700x44, 0xeb, 0x54, 0x2a, 0xd6, 0x2e, 0xbf, 0xdd, 0x19, 0x91, 0xa0, 0xa3, 0xa5, 0xa9, 0xb1,
2710xe0, 0x42, 0x06, 0x8e, 0x7f, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xc4, 0x0a, 0x96, 0x8f, 0x7d,
2720x78, 0x72, 0x47, 0x0c, 0x7b, 0x74, 0x6a, 0x56, 0x2e, 0xde, 0x1f, 0xbc, 0xfa, 0x57, 0x0d,
2730x79, 0x51, 0x01, 0x61, 0x21, 0xa1, 0xc0, 0xe3, 0x25, 0xa9, 0xb1, 0xc1, 0xe1, 0x40, 0x02,
2740x67, 0x4c, 0x1a, 0x97, 0x8d, 0x98, 0x93, 0xa4, 0xab, 0xd4, 0x2a, 0xd6, 0x0f, 0x9c, 0x9b,
2750xb4, 0xcb, 0x14, 0xaa, 0xb7, 0xcd, 0xf9, 0x51, 0x20, 0xa3, 0xc4, 0xeb, 0x35, 0xc9, 0xf1,
2760x60, 0x42, 0x06, 0x8e, 0x7f, 0x7c, 0x7a, 0x76, 0x6e, 0x3f, 0xfc, 0x7a, 0x76, 0x6e, 0x5e,
2770x3e, 0xfe, 0x7e, 0x5f, 0x3c, 0xdb, 0x15, 0x89, 0x71, 0x41, 0xe1, 0x21, 0xc0, 0xe3, 0x44,
2780xeb, 0x54, 0x2a, 0xb7, 0xcd, 0xf9, 0x70, 0x62, 0x27, 0xad, 0xd8, 0x32, 0xc7, 0x0c, 0x7b,
2790x74, 0x4b, 0x14, 0xaa, 0xb7, 0xec, 0x3b, 0xd5, 0x28, 0xd2, 0x07, 0x6d, 0x39, 0xd1, 0x20,
2800xc2, 0xe7, 0x4c, 0x1a, 0x97, 0x8d, 0x98, 0xb2, 0xc7, 0x0c, 0x59, 0x28, 0xf3, 0x9b };
diff --git a/keyboards/oddball/rules.mk b/keyboards/oddball/rules.mk
index f1e7d4894..d675ebcf2 100644
--- a/keyboards/oddball/rules.mk
+++ b/keyboards/oddball/rules.mk
@@ -21,7 +21,3 @@ SPLIT_KEYBOARD = yes
21POINTING_DEVICE_ENABLE = yes 21POINTING_DEVICE_ENABLE = yes
22 22
23DEFAULT_FOLDER = oddball/v1 23DEFAULT_FOLDER = oddball/v1
24
25SRC += spi_master.c
26SRC += drivers/sensors/adns9800.c
27SRC += pmw/pmw.c
diff --git a/keyboards/ploopyco/mouse/mouse.c b/keyboards/ploopyco/mouse/mouse.c
index 0bf96a20f..1b00ef3b7 100644
--- a/keyboards/ploopyco/mouse/mouse.c
+++ b/keyboards/ploopyco/mouse/mouse.c
@@ -31,7 +31,8 @@
31# define OPT_SCALE 1 // Multiplier for wheel 31# define OPT_SCALE 1 // Multiplier for wheel
32#endif 32#endif
33#ifndef PLOOPY_DPI_OPTIONS 33#ifndef PLOOPY_DPI_OPTIONS
34# define PLOOPY_DPI_OPTIONS { 1200, 1600, 2400 } 34# define PLOOPY_DPI_OPTIONS \
35 { 1200, 1600, 2400 }
35# ifndef PLOOPY_DPI_DEFAULT 36# ifndef PLOOPY_DPI_DEFAULT
36# define PLOOPY_DPI_DEFAULT 1 37# define PLOOPY_DPI_DEFAULT 1
37# endif 38# endif
@@ -40,10 +41,10 @@
40# define PLOOPY_DPI_DEFAULT 0 41# define PLOOPY_DPI_DEFAULT 0
41#endif 42#endif
42#ifndef PLOOPY_DRAGSCROLL_DPI 43#ifndef PLOOPY_DRAGSCROLL_DPI
43# define PLOOPY_DRAGSCROLL_DPI 100 // Fixed-DPI Drag Scroll 44# define PLOOPY_DRAGSCROLL_DPI 100 // Fixed-DPI Drag Scroll
44#endif 45#endif
45#ifndef PLOOPY_DRAGSCROLL_MULTIPLIER 46#ifndef PLOOPY_DRAGSCROLL_MULTIPLIER
46# define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75 // Variable-DPI Drag Scroll 47# define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75 // Variable-DPI Drag Scroll
47#endif 48#endif
48 49
49keyboard_config_t keyboard_config; 50keyboard_config_t keyboard_config;
@@ -65,13 +66,7 @@ uint8_t OptLowPin = OPT_ENC1;
65bool debug_encoder = false; 66bool debug_encoder = false;
66bool is_drag_scroll = false; 67bool is_drag_scroll = false;
67 68
68__attribute__((weak)) void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v) { 69void process_wheel(report_mouse_t* mouse_report) {
69 mouse_report->h = h;
70 mouse_report->v = v;
71}
72
73__attribute__((weak)) void process_wheel(report_mouse_t* mouse_report) {
74 // TODO: Replace this with interrupt driven code, polling is S L O W
75 // Lovingly ripped from the Ploopy Source 70 // Lovingly ripped from the Ploopy Source
76 71
77 // If the mouse wheel was just released, do not scroll. 72 // If the mouse wheel was just released, do not scroll.
@@ -99,56 +94,25 @@ __attribute__((weak)) void process_wheel(report_mouse_t* mouse_report) {
99 int dir = opt_encoder_handler(p1, p2); 94 int dir = opt_encoder_handler(p1, p2);
100 95
101 if (dir == 0) return; 96 if (dir == 0) return;
102 process_wheel_user(mouse_report, mouse_report->h, (int)(mouse_report->v + (dir * OPT_SCALE))); 97 mouse_report->v = (int8_t)(dir * OPT_SCALE);
103}
104
105__attribute__((weak)) void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) {
106 mouse_report->x = x;
107 mouse_report->y = y;
108} 98}
109 99
110__attribute__((weak)) void process_mouse(report_mouse_t* mouse_report) { 100__attribute__((weak)) report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
111 report_pmw_t data = pmw_read_burst(); 101 process_wheel(&mouse_report);
112 if (data.isOnSurface && data.isMotion) {
113 // Reset timer if stopped moving
114 if (!data.isMotion) {
115 if (MotionStart != 0) MotionStart = 0;
116 return;
117 }
118
119 // Set timer if new motion
120 if ((MotionStart == 0) && data.isMotion) {
121 if (debug_mouse) dprintf("Starting motion.\n");
122 MotionStart = timer_read();
123 }
124 102
125 if (debug_mouse) { 103 if (is_drag_scroll) {
126 dprintf("Delt] d: %d t: %u\n", abs(data.dx) + abs(data.dy), MotionStart); 104 mouse_report.h = mouse_report.x;
127 } 105#ifdef PLOOPY_DRAGSCROLL_INVERT
128 if (debug_mouse) { 106 // Invert vertical scroll direction
129 dprintf("Pre ] X: %d, Y: %d\n", data.dx, data.dy); 107 mouse_report.v = -mouse_report.y;
130 }
131#if defined(PROFILE_LINEAR)
132 float scale = float(timer_elaspsed(MotionStart)) / 1000.0;
133 data.dx *= scale;
134 data.dy *= scale;
135#elif defined(PROFILE_INVERSE)
136 // TODO
137#else 108#else
138 // no post processing 109 mouse_report.v = mouse_report.y;
139#endif 110#endif
140 // apply multiplier 111 mouse_report.x = 0;
141 // data.dx *= mouse_multiplier; 112 mouse_report.y = 0;
142 // data.dy *= mouse_multiplier;
143
144 // Wrap to HID size
145 data.dx = constrain(data.dx, -127, 127);
146 data.dy = constrain(data.dy, -127, 127);
147 if (debug_mouse) dprintf("Cons] X: %d, Y: %d\n", data.dx, data.dy);
148 // dprintf("Elapsed:%u, X: %f Y: %\n", i, pgm_read_byte(firmware_data+i));
149
150 process_mouse_user(mouse_report, data.dx, data.dy);
151 } 113 }
114
115 return pointing_device_task_user(mouse_report);
152} 116}
153 117
154bool process_record_kb(uint16_t keycode, keyrecord_t* record) { 118bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
@@ -169,7 +133,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
169 if (keycode == DPI_CONFIG && record->event.pressed) { 133 if (keycode == DPI_CONFIG && record->event.pressed) {
170 keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE; 134 keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;
171 eeconfig_update_kb(keyboard_config.raw); 135 eeconfig_update_kb(keyboard_config.raw);
172 pmw_set_cpi(dpi_array[keyboard_config.dpi_config]); 136 pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
173 } 137 }
174 138
175 if (keycode == DRAG_SCROLL) { 139 if (keycode == DRAG_SCROLL) {
@@ -180,9 +144,9 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
180 is_drag_scroll ^= 1; 144 is_drag_scroll ^= 1;
181 } 145 }
182#ifdef PLOOPY_DRAGSCROLL_FIXED 146#ifdef PLOOPY_DRAGSCROLL_FIXED
183 pmw_set_cpi(is_drag_scroll ? PLOOPY_DRAGSCROLL_DPI : dpi_array[keyboard_config.dpi_config]); 147 pointing_device_set_cpi(is_drag_scroll ? PLOOPY_DRAGSCROLL_DPI : dpi_array[keyboard_config.dpi_config]);
184#else 148#else
185 pmw_set_cpi(is_drag_scroll ? (dpi_array[keyboard_config.dpi_config] * PLOOPY_DRAGSCROLL_MULTIPLIER) : dpi_array[keyboard_config.dpi_config]); 149 pointing_device_set_cpi(is_drag_scroll ? (dpi_array[keyboard_config.dpi_config] * PLOOPY_DRAGSCROLL_MULTIPLIER) : dpi_array[keyboard_config.dpi_config]);
186#endif 150#endif
187 } 151 }
188 152
@@ -194,11 +158,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
194#ifndef MOUSEKEY_ENABLE 158#ifndef MOUSEKEY_ENABLE
195 if (IS_MOUSEKEY_BUTTON(keycode)) { 159 if (IS_MOUSEKEY_BUTTON(keycode)) {
196 report_mouse_t currentReport = pointing_device_get_report(); 160 report_mouse_t currentReport = pointing_device_get_report();
197 if (record->event.pressed) { 161 currentReport.buttons = pointing_device_handle_buttons(currentReport.buttons, record->event.pressed, keycode - KC_MS_BTN1);
198 currentReport.buttons |= 1 << (keycode - KC_MS_BTN1);
199 } else {
200 currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1));
201 }
202 pointing_device_set_report(currentReport); 162 pointing_device_set_report(currentReport);
203 pointing_device_send(); 163 pointing_device_send();
204 } 164 }
@@ -240,35 +200,12 @@ void keyboard_pre_init_kb(void) {
240 keyboard_pre_init_user(); 200 keyboard_pre_init_user();
241} 201}
242 202
243void pointing_device_init(void) { 203void pointing_device_init_kb(void) {
244 // initialize ball sensor 204 pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
245 pmw_spi_init();
246 // initialize the scroll wheel's optical encoder 205 // initialize the scroll wheel's optical encoder
247 opt_encoder_init(); 206 opt_encoder_init();
248} 207}
249 208
250
251void pointing_device_task(void) {
252 report_mouse_t mouse_report = pointing_device_get_report();
253 process_wheel(&mouse_report);
254 process_mouse(&mouse_report);
255
256 if (is_drag_scroll) {
257 mouse_report.h = mouse_report.x;
258#ifdef PLOOPY_DRAGSCROLL_INVERT
259 // Invert vertical scroll direction
260 mouse_report.v = -mouse_report.y;
261#else
262 mouse_report.v = mouse_report.y;
263#endif
264 mouse_report.x = 0;
265 mouse_report.y = 0;
266 }
267
268 pointing_device_set_report(mouse_report);
269 pointing_device_send();
270}
271
272void eeconfig_init_kb(void) { 209void eeconfig_init_kb(void) {
273 keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT; 210 keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT;
274 eeconfig_update_kb(keyboard_config.raw); 211 eeconfig_update_kb(keyboard_config.raw);
@@ -284,9 +221,3 @@ void matrix_init_kb(void) {
284 } 221 }
285 matrix_init_user(); 222 matrix_init_user();
286} 223}
287
288void keyboard_post_init_kb(void) {
289 pmw_set_cpi(dpi_array[keyboard_config.dpi_config]);
290
291 keyboard_post_init_user();
292}
diff --git a/keyboards/ploopyco/mouse/mouse.h b/keyboards/ploopyco/mouse/mouse.h
index d11aa5e9a..ee5982713 100644
--- a/keyboards/ploopyco/mouse/mouse.h
+++ b/keyboards/ploopyco/mouse/mouse.h
@@ -19,11 +19,8 @@
19#pragma once 19#pragma once
20 20
21#include "quantum.h" 21#include "quantum.h"
22#include "spi_master.h"
23#include "drivers/sensors/pmw3360.h"
24#include "analog.h" 22#include "analog.h"
25#include "opt_encoder.h" 23#include "opt_encoder.h"
26#include "pointing_device.h"
27 24
28// Sensor defs 25// Sensor defs
29#define OPT_ENC1 F0 26#define OPT_ENC1 F0
@@ -31,10 +28,7 @@
31#define OPT_ENC1_MUX 0 28#define OPT_ENC1_MUX 0
32#define OPT_ENC2_MUX 4 29#define OPT_ENC2_MUX 4
33 30
34void process_mouse(report_mouse_t* mouse_report);
35void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y);
36void process_wheel(report_mouse_t* mouse_report); 31void process_wheel(report_mouse_t* mouse_report);
37void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v);
38 32
39#define LAYOUT(BLL, BL, BM, BR, BRR, BF, BB, BDPI) \ 33#define LAYOUT(BLL, BL, BM, BR, BRR, BF, BB, BDPI) \
40 { {BL, BM, BR, BF, BB, BRR, BLL, BDPI}, } 34 { {BL, BM, BR, BF, BB, BRR, BLL, BDPI}, }
diff --git a/keyboards/ploopyco/mouse/rules.mk b/keyboards/ploopyco/mouse/rules.mk
index c02afa00c..45cb38901 100644
--- a/keyboards/ploopyco/mouse/rules.mk
+++ b/keyboards/ploopyco/mouse/rules.mk
@@ -22,7 +22,8 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
22RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow 22RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
23AUDIO_ENABLE = no # Audio output 23AUDIO_ENABLE = no # Audio output
24POINTING_DEVICE_ENABLE = yes 24POINTING_DEVICE_ENABLE = yes
25POINTING_DEVICE_DRIVER = pmw3360
25MOUSEKEY_ENABLE = yes # Mouse keys 26MOUSEKEY_ENABLE = yes # Mouse keys
26 27
27QUANTUM_LIB_SRC += analog.c spi_master.c 28QUANTUM_LIB_SRC += analog.c
28SRC += drivers/sensors/pmw3360.c opt_encoder.c 29SRC += opt_encoder.c
diff --git a/keyboards/ploopyco/trackball/rules.mk b/keyboards/ploopyco/trackball/rules.mk
index af9bc7d4c..d11858152 100644
--- a/keyboards/ploopyco/trackball/rules.mk
+++ b/keyboards/ploopyco/trackball/rules.mk
@@ -19,9 +19,10 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
19RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow 19RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
20AUDIO_ENABLE = no # Audio output 20AUDIO_ENABLE = no # Audio output
21POINTING_DEVICE_ENABLE = yes 21POINTING_DEVICE_ENABLE = yes
22POINTING_DEVICE_DRIVER = pmw3360
22MOUSEKEY_ENABLE = yes # Mouse keys 23MOUSEKEY_ENABLE = yes # Mouse keys
23 24
24QUANTUM_LIB_SRC += analog.c spi_master.c 25QUANTUM_LIB_SRC += analog.c
25SRC += drivers/sensors/pmw3360.c opt_encoder.c 26SRC += opt_encoder.c
26 27
27DEFAULT_FOLDER = ploopyco/trackball/rev1_005 28DEFAULT_FOLDER = ploopyco/trackball/rev1_005
diff --git a/keyboards/ploopyco/trackball/trackball.c b/keyboards/ploopyco/trackball/trackball.c
index 719020997..e2a6e4ed5 100644
--- a/keyboards/ploopyco/trackball/trackball.c
+++ b/keyboards/ploopyco/trackball/trackball.c
@@ -65,12 +65,7 @@ uint8_t OptLowPin = OPT_ENC1;
65bool debug_encoder = false; 65bool debug_encoder = false;
66bool is_drag_scroll = false; 66bool is_drag_scroll = false;
67 67
68__attribute__((weak)) void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v) { 68void process_wheel(report_mouse_t* mouse_report) {
69 mouse_report->h = h;
70 mouse_report->v = v;
71}
72
73__attribute__((weak)) void process_wheel(report_mouse_t* mouse_report) {
74 // TODO: Replace this with interrupt driven code, polling is S L O W 69 // TODO: Replace this with interrupt driven code, polling is S L O W
75 // Lovingly ripped from the Ploopy Source 70 // Lovingly ripped from the Ploopy Source
76 71
@@ -99,56 +94,25 @@ __attribute__((weak)) void process_wheel(report_mouse_t* mouse_report) {
99 int dir = opt_encoder_handler(p1, p2); 94 int dir = opt_encoder_handler(p1, p2);
100 95
101 if (dir == 0) return; 96 if (dir == 0) return;
102 process_wheel_user(mouse_report, mouse_report->h, (int)(mouse_report->v + (dir * OPT_SCALE))); 97 mouse_report->v = (int8_t)(dir * OPT_SCALE);
103} 98}
104 99
105__attribute__((weak)) void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) { 100report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
106 mouse_report->x = x; 101 process_wheel(&mouse_report);
107 mouse_report->y = y;
108}
109
110__attribute__((weak)) void process_mouse(report_mouse_t* mouse_report) {
111 report_pmw_t data = pmw_read_burst();
112 if (data.isOnSurface && data.isMotion) {
113 // Reset timer if stopped moving
114 if (!data.isMotion) {
115 if (MotionStart != 0) MotionStart = 0;
116 return;
117 }
118
119 // Set timer if new motion
120 if ((MotionStart == 0) && data.isMotion) {
121 if (debug_mouse) dprintf("Starting motion.\n");
122 MotionStart = timer_read();
123 }
124 102
125 if (debug_mouse) { 103 if (is_drag_scroll) {
126 dprintf("Delt] d: %d t: %u\n", abs(data.dx) + abs(data.dy), MotionStart); 104 mouse_report.h = mouse_report.x;
127 } 105#ifdef PLOOPY_DRAGSCROLL_INVERT
128 if (debug_mouse) { 106 // Invert vertical scroll direction
129 dprintf("Pre ] X: %d, Y: %d\n", data.dx, data.dy); 107 mouse_report.v = -mouse_report.y;
130 }
131#if defined(PROFILE_LINEAR)
132 float scale = float(timer_elaspsed(MotionStart)) / 1000.0;
133 data.dx *= scale;
134 data.dy *= scale;
135#elif defined(PROFILE_INVERSE)
136 // TODO
137#else 108#else
138 // no post processing 109 mouse_report.v = mouse_report.y;
139#endif 110#endif
140 // apply multiplier 111 mouse_report.x = 0;
141 // data.dx *= mouse_multiplier; 112 mouse_report.y = 0;
142 // data.dy *= mouse_multiplier;
143
144 // Wrap to HID size
145 data.dx = constrain(data.dx, -127, 127);
146 data.dy = constrain(data.dy, -127, 127);
147 if (debug_mouse) dprintf("Cons] X: %d, Y: %d\n", data.dx, data.dy);
148 // dprintf("Elapsed:%u, X: %f Y: %\n", i, pgm_read_byte(firmware_data+i));
149
150 process_mouse_user(mouse_report, data.dx, -data.dy);
151 } 113 }
114
115 return pointing_device_task_user(mouse_report);
152} 116}
153 117
154bool process_record_kb(uint16_t keycode, keyrecord_t* record) { 118bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
@@ -169,7 +133,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
169 if (keycode == DPI_CONFIG && record->event.pressed) { 133 if (keycode == DPI_CONFIG && record->event.pressed) {
170 keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE; 134 keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;
171 eeconfig_update_kb(keyboard_config.raw); 135 eeconfig_update_kb(keyboard_config.raw);
172 pmw_set_cpi(dpi_array[keyboard_config.dpi_config]); 136 pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
173 } 137 }
174 138
175 if (keycode == DRAG_SCROLL) { 139 if (keycode == DRAG_SCROLL) {
@@ -180,9 +144,9 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
180 is_drag_scroll ^= 1; 144 is_drag_scroll ^= 1;
181 } 145 }
182#ifdef PLOOPY_DRAGSCROLL_FIXED 146#ifdef PLOOPY_DRAGSCROLL_FIXED
183 pmw_set_cpi(is_drag_scroll ? PLOOPY_DRAGSCROLL_DPI : dpi_array[keyboard_config.dpi_config]); 147 pointing_device_set_cpi(is_drag_scroll ? PLOOPY_DRAGSCROLL_DPI : dpi_array[keyboard_config.dpi_config]);
184#else 148#else
185 pmw_set_cpi(is_drag_scroll ? (dpi_array[keyboard_config.dpi_config] * PLOOPY_DRAGSCROLL_MULTIPLIER) : dpi_array[keyboard_config.dpi_config]); 149 pointing_device_set_cpi(is_drag_scroll ? (dpi_array[keyboard_config.dpi_config] * PLOOPY_DRAGSCROLL_MULTIPLIER) : dpi_array[keyboard_config.dpi_config]);
186#endif 150#endif
187 } 151 }
188 152
@@ -194,11 +158,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
194#ifndef MOUSEKEY_ENABLE 158#ifndef MOUSEKEY_ENABLE
195 if (IS_MOUSEKEY_BUTTON(keycode)) { 159 if (IS_MOUSEKEY_BUTTON(keycode)) {
196 report_mouse_t currentReport = pointing_device_get_report(); 160 report_mouse_t currentReport = pointing_device_get_report();
197 if (record->event.pressed) { 161 currentReport.buttons = pointing_device_handle_buttons(record->event.pressed, keycode - KC_MS_BTN1);
198 currentReport.buttons |= 1 << (keycode - KC_MS_BTN1);
199 } else {
200 currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1));
201 }
202 pointing_device_set_report(currentReport); 162 pointing_device_set_report(currentReport);
203 pointing_device_send(); 163 pointing_device_send();
204 } 164 }
@@ -239,35 +199,12 @@ void keyboard_pre_init_kb(void) {
239 keyboard_pre_init_user(); 199 keyboard_pre_init_user();
240} 200}
241 201
242void pointing_device_init(void) { 202void pointing_device_init_kb(void) {
243 // initialize ball sensor 203 pmw3360_set_cpi(dpi_array[keyboard_config.dpi_config]);
244 pmw_spi_init();
245 // initialize the scroll wheel's optical encoder 204 // initialize the scroll wheel's optical encoder
246 opt_encoder_init(); 205 opt_encoder_init();
247} 206}
248 207
249
250void pointing_device_task(void) {
251 report_mouse_t mouse_report = pointing_device_get_report();
252 process_wheel(&mouse_report);
253 process_mouse(&mouse_report);
254
255 if (is_drag_scroll) {
256 mouse_report.h = mouse_report.x;
257#ifdef PLOOPY_DRAGSCROLL_INVERT
258 // Invert vertical scroll direction
259 mouse_report.v = -mouse_report.y;
260#else
261 mouse_report.v = mouse_report.y;
262#endif
263 mouse_report.x = 0;
264 mouse_report.y = 0;
265 }
266
267 pointing_device_set_report(mouse_report);
268 pointing_device_send();
269}
270
271void eeconfig_init_kb(void) { 208void eeconfig_init_kb(void) {
272 keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT; 209 keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT;
273 eeconfig_update_kb(keyboard_config.raw); 210 eeconfig_update_kb(keyboard_config.raw);
@@ -285,7 +222,7 @@ void matrix_init_kb(void) {
285} 222}
286 223
287void keyboard_post_init_kb(void) { 224void keyboard_post_init_kb(void) {
288 pmw_set_cpi(dpi_array[keyboard_config.dpi_config]); 225 pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
289 226
290 keyboard_post_init_user(); 227 keyboard_post_init_user();
291} 228}
diff --git a/keyboards/ploopyco/trackball/trackball.h b/keyboards/ploopyco/trackball/trackball.h
index 70f5d83b1..52d955325 100644
--- a/keyboards/ploopyco/trackball/trackball.h
+++ b/keyboards/ploopyco/trackball/trackball.h
@@ -19,11 +19,8 @@
19#pragma once 19#pragma once
20 20
21#include "quantum.h" 21#include "quantum.h"
22#include "spi_master.h"
23#include "drivers/sensors/pmw3360.h"
24#include "analog.h" 22#include "analog.h"
25#include "opt_encoder.h" 23#include "opt_encoder.h"
26#include "pointing_device.h"
27#if defined(KEYBOARD_ploopyco_trackball_rev1) 24#if defined(KEYBOARD_ploopyco_trackball_rev1)
28# include "rev1.h" 25# include "rev1.h"
29#elif defined(KEYBOARD_ploopyco_trackball_rev1_005) 26#elif defined(KEYBOARD_ploopyco_trackball_rev1_005)
@@ -36,10 +33,7 @@
36#define OPT_ENC1_MUX 0 33#define OPT_ENC1_MUX 0
37#define OPT_ENC2_MUX 4 34#define OPT_ENC2_MUX 4
38 35
39void process_mouse(report_mouse_t* mouse_report);
40void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y);
41void process_wheel(report_mouse_t* mouse_report); 36void process_wheel(report_mouse_t* mouse_report);
42void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v);
43 37
44#define LAYOUT(BL, BM, BR, BF, BB) \ 38#define LAYOUT(BL, BM, BR, BF, BB) \
45 { {BL, BM, BR, BF, BB}, } 39 { {BL, BM, BR, BF, BB}, }
diff --git a/keyboards/ploopyco/trackball_mini/config.h b/keyboards/ploopyco/trackball_mini/config.h
index f76a6eb2c..52d7390ca 100644
--- a/keyboards/ploopyco/trackball_mini/config.h
+++ b/keyboards/ploopyco/trackball_mini/config.h
@@ -56,3 +56,9 @@
56 56
57// If board has a debug LED, you can enable it by defining this 57// If board has a debug LED, you can enable it by defining this
58// #define DEBUG_LED_PIN F7 58// #define DEBUG_LED_PIN F7
59
60#define ADNS5050_SCLK_PIN B7
61#define ADNS5050_SDIO_PIN C6
62#define ADNS5050_CS_PIN B4
63
64#define POINTING_DEVICE_ROTATION_90
diff --git a/keyboards/ploopyco/trackball_mini/keymaps/drag_scroll/keymap.c b/keyboards/ploopyco/trackball_mini/keymaps/drag_scroll/keymap.c
index 7784bc855..7eb973216 100644
--- a/keyboards/ploopyco/trackball_mini/keymaps/drag_scroll/keymap.c
+++ b/keyboards/ploopyco/trackball_mini/keymaps/drag_scroll/keymap.c
@@ -44,7 +44,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
44// to only scroll in one direction, if you wanted, as well. In fact, 44// to only scroll in one direction, if you wanted, as well. In fact,
45// there is no reason that you need to send this to the mouse report. 45// there is no reason that you need to send this to the mouse report.
46// You could have it register a key, instead. 46// You could have it register a key, instead.
47void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) { 47void process_mouse_user(report_mouse_t* mouse_report, int8_t x, int8_t y) {
48 if (is_drag_scroll) { 48 if (is_drag_scroll) {
49 mouse_report->h = x; 49 mouse_report->h = x;
50 mouse_report->v = y; 50 mouse_report->v = y;
diff --git a/keyboards/ploopyco/trackball_mini/rules.mk b/keyboards/ploopyco/trackball_mini/rules.mk
index 07a6889cb..8d76c9b3d 100644
--- a/keyboards/ploopyco/trackball_mini/rules.mk
+++ b/keyboards/ploopyco/trackball_mini/rules.mk
@@ -1,9 +1,6 @@
1# MCU name 1# MCU name
2MCU = atmega32u4 2MCU = atmega32u4
3 3
4# Processor frequency
5F_CPU = 16000000
6
7# Bootloader selection 4# Bootloader selection
8BOOTLOADER = atmel-dfu 5BOOTLOADER = atmel-dfu
9 6
@@ -22,9 +19,10 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
22RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow 19RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
23AUDIO_ENABLE = no # Audio output 20AUDIO_ENABLE = no # Audio output
24POINTING_DEVICE_ENABLE = yes 21POINTING_DEVICE_ENABLE = yes
22POINTING_DEVICE_DRIVER = adns5050
25MOUSEKEY_ENABLE = no # Mouse keys 23MOUSEKEY_ENABLE = no # Mouse keys
26 24
27QUANTUM_LIB_SRC += analog.c 25QUANTUM_LIB_SRC += analog.c
28SRC += drivers/sensors/adns5050.c opt_encoder.c 26SRC += opt_encoder.c
29 27
30DEFAULT_FOLDER = ploopyco/trackball_mini/rev1_001 28DEFAULT_FOLDER = ploopyco/trackball_mini/rev1_001
diff --git a/keyboards/ploopyco/trackball_mini/trackball_mini.c b/keyboards/ploopyco/trackball_mini/trackball_mini.c
index b50850b54..2158a8f48 100644
--- a/keyboards/ploopyco/trackball_mini/trackball_mini.c
+++ b/keyboards/ploopyco/trackball_mini/trackball_mini.c
@@ -37,20 +37,17 @@
37# define OPT_SCALE 1 // Multiplier for wheel 37# define OPT_SCALE 1 // Multiplier for wheel
38#endif 38#endif
39 39
40#define PLOOPY_DPI_OPTIONS { CPI375, CPI750, CPI1375 } 40#define PLOOPY_DPI_OPTIONS \
41 { 375, 750, 1375 }
41#define PLOOPY_DPI_DEFAULT 2 42#define PLOOPY_DPI_DEFAULT 2
42 43
43#ifndef PLOOPY_DRAGSCROLL_DPI 44#ifndef PLOOPY_DRAGSCROLL_DPI
44# define PLOOPY_DRAGSCROLL_DPI CPI375 // Fixed-DPI Drag Scroll 45# define PLOOPY_DRAGSCROLL_DPI 375 // Fixed-DPI Drag Scroll
45#endif 46#endif
46#ifndef PLOOPY_DRAGSCROLL_MULTIPLIER 47#ifndef PLOOPY_DRAGSCROLL_MULTIPLIER
47# define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75 // Variable-DPI Drag Scroll 48# define PLOOPY_DRAGSCROLL_MULTIPLIER 0.75 // Variable-DPI Drag Scroll
48#endif 49#endif
49 50
50// Transformation constants for delta-X and delta-Y
51const static float ADNS_X_TRANSFORM = -1.0;
52const static float ADNS_Y_TRANSFORM = 1.0;
53
54keyboard_config_t keyboard_config; 51keyboard_config_t keyboard_config;
55uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS; 52uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS;
56#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t)) 53#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t))
@@ -70,12 +67,7 @@ uint8_t OptLowPin = OPT_ENC1;
70bool debug_encoder = false; 67bool debug_encoder = false;
71bool is_drag_scroll = false; 68bool is_drag_scroll = false;
72 69
73__attribute__((weak)) void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v) { 70void process_wheel(report_mouse_t* mouse_report) {
74 mouse_report->h = h;
75 mouse_report->v = v;
76}
77
78__attribute__((weak)) void process_wheel(report_mouse_t* mouse_report) {
79 // If the mouse wheel was just released, do not scroll. 71 // If the mouse wheel was just released, do not scroll.
80 if (timer_elapsed(lastMidClick) < SCROLL_BUTT_DEBOUNCE) 72 if (timer_elapsed(lastMidClick) < SCROLL_BUTT_DEBOUNCE)
81 return; 73 return;
@@ -103,33 +95,31 @@ __attribute__((weak)) void process_wheel(report_mouse_t* mouse_report) {
103 if (dir == 0) 95 if (dir == 0)
104 return; 96 return;
105 97
106 process_wheel_user(mouse_report, mouse_report->h, (int)(mouse_report->v + (dir * OPT_SCALE))); 98 mouse_report->v = (int8_t)(dir * OPT_SCALE);
107} 99}
108 100
109__attribute__((weak)) void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) { 101void pointing_device_init_kb(void) {
110 mouse_report->x = x; 102 opt_encoder_init();
111 mouse_report->y = y;
112}
113
114__attribute__((weak)) void process_mouse(report_mouse_t* mouse_report) {
115 report_adns_t data = adns_read_burst();
116
117 if (data.dx != 0 || data.dy != 0) {
118 if (debug_mouse)
119 dprintf("Raw ] X: %d, Y: %d\n", data.dx, data.dy);
120 103
121 // Apply delta-X and delta-Y transformations. 104 // set the DPI.
122 // x and y are swapped 105 pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
123 // the sensor is rotated 106}
124 // by 90 degrees
125 float xt = (float) data.dy * ADNS_X_TRANSFORM;
126 float yt = (float) data.dx * ADNS_Y_TRANSFORM;
127 107
128 int16_t xti = (int16_t)xt; 108report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
129 int16_t yti = (int16_t)yt;
130 109
131 process_mouse_user(mouse_report, xti, yti); 110 if (is_drag_scroll) {
111 mouse_report.h = mouse_report.x;
112#ifdef PLOOPY_DRAGSCROLL_INVERT
113 // Invert vertical scroll direction
114 mouse_report.v = -mouse_report.y;
115#else
116 mouse_report.v = mouse_report.y;
117#endif
118 mouse_report.x = 0;
119 mouse_report.y = 0;
132 } 120 }
121
122 return pointing_device_task_user(mouse_report);
133} 123}
134 124
135bool process_record_kb(uint16_t keycode, keyrecord_t* record) { 125bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
@@ -147,7 +137,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
147 if (keycode == DPI_CONFIG && record->event.pressed) { 137 if (keycode == DPI_CONFIG && record->event.pressed) {
148 keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE; 138 keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;
149 eeconfig_update_kb(keyboard_config.raw); 139 eeconfig_update_kb(keyboard_config.raw);
150 adns_set_cpi(dpi_array[keyboard_config.dpi_config]); 140 pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
151 } 141 }
152 142
153 if (keycode == DRAG_SCROLL) { 143 if (keycode == DRAG_SCROLL) {
@@ -157,7 +147,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
157 { 147 {
158 is_drag_scroll ^= 1; 148 is_drag_scroll ^= 1;
159 } 149 }
160 adns_set_cpi(is_drag_scroll ? PLOOPY_DRAGSCROLL_DPI : dpi_array[keyboard_config.dpi_config]); 150 pointing_device_set_cpi(is_drag_scroll ? PLOOPY_DRAGSCROLL_DPI : dpi_array[keyboard_config.dpi_config]);
161 } 151 }
162 152
163/* If Mousekeys is disabled, then use handle the mouse button 153/* If Mousekeys is disabled, then use handle the mouse button
@@ -168,11 +158,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
168#ifndef MOUSEKEY_ENABLE 158#ifndef MOUSEKEY_ENABLE
169 if (IS_MOUSEKEY_BUTTON(keycode)) { 159 if (IS_MOUSEKEY_BUTTON(keycode)) {
170 report_mouse_t currentReport = pointing_device_get_report(); 160 report_mouse_t currentReport = pointing_device_get_report();
171 if (record->event.pressed) { 161 currentReport.buttons = pointing_device_handle_buttons(currentReport.buttons, record->event.pressed, keycode - KC_MS_BTN1);
172 currentReport.buttons |= 1 << (keycode - KC_MS_BTN1);
173 } else {
174 currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1));
175 }
176 pointing_device_set_report(currentReport); 162 pointing_device_set_report(currentReport);
177 pointing_device_send(); 163 pointing_device_send();
178 } 164 }
@@ -207,48 +193,6 @@ void keyboard_pre_init_kb(void) {
207 keyboard_pre_init_user(); 193 keyboard_pre_init_user();
208} 194}
209 195
210void pointing_device_init(void) {
211 adns_init();
212 opt_encoder_init();
213
214 // reboot the adns.
215 // if the adns hasn't initialized yet, this is harmless.
216 adns_write_reg(REG_CHIP_RESET, 0x5a);
217
218 // wait maximum time before adns is ready.
219 // this ensures that the adns is actuall ready after reset.
220 wait_ms(55);
221
222 // read a burst from the adns and then discard it.
223 // gets the adns ready for write commands
224 // (for example, setting the dpi).
225 adns_read_burst();
226
227 // set the DPI.
228 adns_set_cpi(dpi_array[keyboard_config.dpi_config]);
229}
230
231void pointing_device_task(void) {
232 report_mouse_t mouse_report = pointing_device_get_report();
233 process_wheel(&mouse_report);
234 process_mouse(&mouse_report);
235
236 if (is_drag_scroll) {
237 mouse_report.h = mouse_report.x;
238#ifdef PLOOPY_DRAGSCROLL_INVERT
239 // Invert vertical scroll direction
240 mouse_report.v = -mouse_report.y;
241#else
242 mouse_report.v = mouse_report.y;
243#endif
244 mouse_report.x = 0;
245 mouse_report.y = 0;
246 }
247
248 pointing_device_set_report(mouse_report);
249 pointing_device_send();
250}
251
252void eeconfig_init_kb(void) { 196void eeconfig_init_kb(void) {
253 keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT; 197 keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT;
254 eeconfig_update_kb(keyboard_config.raw); 198 eeconfig_update_kb(keyboard_config.raw);
diff --git a/keyboards/ploopyco/trackball_mini/trackball_mini.h b/keyboards/ploopyco/trackball_mini/trackball_mini.h
index 7bcb02a94..fc86fe776 100644
--- a/keyboards/ploopyco/trackball_mini/trackball_mini.h
+++ b/keyboards/ploopyco/trackball_mini/trackball_mini.h
@@ -20,10 +20,8 @@
20#pragma once 20#pragma once
21 21
22#include "quantum.h" 22#include "quantum.h"
23#include "drivers/sensors/adns5050.h"
24#include "analog.h" 23#include "analog.h"
25#include "opt_encoder.h" 24#include "opt_encoder.h"
26#include "pointing_device.h"
27 25
28// Sensor defs 26// Sensor defs
29#define OPT_ENC1 F0 27#define OPT_ENC1 F0
@@ -31,10 +29,7 @@
31#define OPT_ENC1_MUX 0 29#define OPT_ENC1_MUX 0
32#define OPT_ENC2_MUX 4 30#define OPT_ENC2_MUX 4
33 31
34void process_mouse(report_mouse_t* mouse_report);
35void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y);
36void process_wheel(report_mouse_t* mouse_report); 32void process_wheel(report_mouse_t* mouse_report);
37void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v);
38 33
39#define LAYOUT(BL, BM, BR, BF, BB) \ 34#define LAYOUT(BL, BM, BR, BF, BB) \
40 { {BL, BM, BR, BF, BB}, } 35 { {BL, BM, BR, BF, BB}, }
diff --git a/keyboards/ploopyco/trackball_nano/config.h b/keyboards/ploopyco/trackball_nano/config.h
index 7450f5574..7d109db99 100644
--- a/keyboards/ploopyco/trackball_nano/config.h
+++ b/keyboards/ploopyco/trackball_nano/config.h
@@ -45,3 +45,9 @@
45 a polling rate as possible. */ 45 a polling rate as possible. */
46#define USB_POLLING_INTERVAL_MS 1 46#define USB_POLLING_INTERVAL_MS 1
47#define USB_MAX_POWER_CONSUMPTION 100 47#define USB_MAX_POWER_CONSUMPTION 100
48
49#define ADNS5050_SCLK_PIN B7
50#define ADNS5050_SDIO_PIN C6
51#define ADNS5050_CS_PIN B4
52
53#define POINTING_DEVICE_ROTATION_90
diff --git a/keyboards/ploopyco/trackball_nano/keymaps/maddie/keymap.c b/keyboards/ploopyco/trackball_nano/keymaps/maddie/keymap.c
index 6f568ecf5..9e33db378 100644
--- a/keyboards/ploopyco/trackball_nano/keymaps/maddie/keymap.c
+++ b/keyboards/ploopyco/trackball_nano/keymaps/maddie/keymap.c
@@ -21,14 +21,14 @@
21// safe range starts at `PLOOPY_SAFE_RANGE` instead. 21// safe range starts at `PLOOPY_SAFE_RANGE` instead.
22uint8_t scroll_enabled = 0; 22uint8_t scroll_enabled = 0;
23uint8_t lock_state = 0; 23uint8_t lock_state = 0;
24int16_t delta_x = 0; 24int8_t delta_x = 0;
25int16_t delta_y = 0; 25int8_t delta_y = 0;
26 26
27void process_mouse_user(report_mouse_t *mouse_report, int16_t x, int16_t y) { 27void process_mouse_user(report_mouse_t *mouse_report, int8_t x, int8_t y) {
28 if (scroll_enabled) { 28 if (scroll_enabled) {
29 delta_x += x; 29 delta_x += x;
30 delta_y += y; 30 delta_y += y;
31 31
32 if (delta_x > 60) { 32 if (delta_x > 60) {
33 mouse_report->h = 1; 33 mouse_report->h = 1;
34 delta_x = 0; 34 delta_x = 0;
@@ -44,10 +44,10 @@ void process_mouse_user(report_mouse_t *mouse_report, int16_t x, int16_t y) {
44 mouse_report->v = 1; 44 mouse_report->v = 1;
45 delta_y = 0; 45 delta_y = 0;
46 } 46 }
47 } else { 47 } else {
48 mouse_report->x = x; 48 mouse_report->x = x;
49 mouse_report->y = y; 49 mouse_report->y = y;
50 } 50 }
51} 51}
52 52
53void keyboard_post_init_user(void) { 53void keyboard_post_init_user(void) {
@@ -62,7 +62,7 @@ bool led_update_user(led_t led_state) {
62 scroll_timer = timer_read(); 62 scroll_timer = timer_read();
63 lock_count = 0; 63 lock_count = 0;
64 } 64 }
65 65
66 if (led_state.num_lock != lock_state) { 66 if (led_state.num_lock != lock_state) {
67 lock_count++; 67 lock_count++;
68 68
@@ -73,7 +73,7 @@ bool led_update_user(led_t led_state) {
73 delta_y = 0; 73 delta_y = 0;
74 } 74 }
75 } 75 }
76 76
77 lock_state = led_state.num_lock; 77 lock_state = led_state.num_lock;
78 return true; 78 return true;
79} 79}
diff --git a/keyboards/ploopyco/trackball_nano/rules.mk b/keyboards/ploopyco/trackball_nano/rules.mk
index a26ad93c8..1a29a561e 100644
--- a/keyboards/ploopyco/trackball_nano/rules.mk
+++ b/keyboards/ploopyco/trackball_nano/rules.mk
@@ -1,9 +1,6 @@
1# MCU name 1# MCU name
2MCU = atmega32u4 2MCU = atmega32u4
3 3
4# Processor frequency
5F_CPU = 16000000
6
7# Bootloader selection 4# Bootloader selection
8BOOTLOADER = atmel-dfu 5BOOTLOADER = atmel-dfu
9 6
@@ -22,9 +19,7 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
22RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow 19RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
23AUDIO_ENABLE = no # Audio output 20AUDIO_ENABLE = no # Audio output
24POINTING_DEVICE_ENABLE = yes 21POINTING_DEVICE_ENABLE = yes
22POINTING_DEVICE_DRIVER = adns5050
25MOUSEKEY_ENABLE = no # Mouse keys 23MOUSEKEY_ENABLE = no # Mouse keys
26 24
27QUANTUM_LIB_SRC += analog.c
28SRC += drivers/sensors/adns5050.c opt_encoder.c
29
30DEFAULT_FOLDER = ploopyco/trackball_nano/rev1_001 25DEFAULT_FOLDER = ploopyco/trackball_nano/rev1_001
diff --git a/keyboards/ploopyco/trackball_nano/trackball_nano.c b/keyboards/ploopyco/trackball_nano/trackball_nano.c
index 9bcfa59ef..2702f6055 100644
--- a/keyboards/ploopyco/trackball_nano/trackball_nano.c
+++ b/keyboards/ploopyco/trackball_nano/trackball_nano.c
@@ -37,7 +37,8 @@
37#endif 37#endif
38 38
39#ifndef PLOOPY_DPI_OPTIONS 39#ifndef PLOOPY_DPI_OPTIONS
40# define PLOOPY_DPI_OPTIONS { CPI375, CPI750, CPI1375 } 40# define PLOOPY_DPI_OPTIONS \
41 { 375, 750, 1375 }
41# ifndef PLOOPY_DPI_DEFAULT 42# ifndef PLOOPY_DPI_DEFAULT
42# define PLOOPY_DPI_DEFAULT 2 43# define PLOOPY_DPI_DEFAULT 2
43# endif 44# endif
@@ -49,12 +50,8 @@
49 50
50const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; 51const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { };
51 52
52// Transformation constants for delta-X and delta-Y
53const static float ADNS_X_TRANSFORM = -1.0;
54const static float ADNS_Y_TRANSFORM = 1.0;
55
56keyboard_config_t keyboard_config; 53keyboard_config_t keyboard_config;
57uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS; 54uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS;
58#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t)) 55#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t))
59 56
60// TODO: Implement libinput profiles 57// TODO: Implement libinput profiles
@@ -63,77 +60,13 @@ uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS;
63// Valid options are ACC_NONE, ACC_LINEAR, ACC_CUSTOM, ACC_QUADRATIC 60// Valid options are ACC_NONE, ACC_LINEAR, ACC_CUSTOM, ACC_QUADRATIC
64 61
65// Trackball State 62// Trackball State
66bool is_scroll_clicked = false; 63bool is_scroll_clicked = false;
67bool BurstState = false; // init burst state for Trackball module 64bool BurstState = false; // init burst state for Trackball module
68uint16_t MotionStart = 0; // Timer for accel, 0 is resting state 65uint16_t MotionStart = 0; // Timer for accel, 0 is resting state
69uint16_t lastScroll = 0; // Previous confirmed wheel event
70uint16_t lastMidClick = 0; // Stops scrollwheel from being read if it was pressed
71uint8_t OptLowPin = OPT_ENC1;
72bool debug_encoder = false;
73
74__attribute__((weak)) void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) {
75 mouse_report->x = x;
76 mouse_report->y = y;
77}
78
79__attribute__((weak)) void process_mouse(report_mouse_t* mouse_report) {
80 report_adns_t data = adns_read_burst();
81
82 if (data.dx != 0 || data.dy != 0) {
83 if (debug_mouse)
84 dprintf("Raw ] X: %d, Y: %d\n", data.dx, data.dy);
85
86 // Apply delta-X and delta-Y transformations.
87 // x and y are swapped
88 // the sensor is rotated
89 // by 90 degrees
90 float xt = (float) data.dy * ADNS_X_TRANSFORM;
91 float yt = (float) data.dx * ADNS_Y_TRANSFORM;
92
93 int16_t xti = (int16_t)xt;
94 int16_t yti = (int16_t)yt;
95
96 process_mouse_user(mouse_report, xti, yti);
97 }
98}
99
100bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
101 xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
102
103 // Update Timer to prevent accidental scrolls
104 if ((record->event.key.col == 1) && (record->event.key.row == 0)) {
105 lastMidClick = timer_read();
106 is_scroll_clicked = record->event.pressed;
107 }
108
109 if (!process_record_user(keycode, record))
110 return false;
111
112 if (keycode == DPI_CONFIG && record->event.pressed) {
113 keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;
114 eeconfig_update_kb(keyboard_config.raw);
115 adns_set_cpi(dpi_array[keyboard_config.dpi_config]);
116 }
117 66
118/* If Mousekeys is disabled, then use handle the mouse button 67void pointing_device_init_kb(void) {
119 * keycodes. This makes things simpler, and allows usage of 68 // set the DPI.
120 * the keycodes in a consistent manner. But only do this if 69 pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
121 * Mousekeys is not enable, so it's not handled twice.
122 */
123#ifndef MOUSEKEY_ENABLE
124 if (IS_MOUSEKEY_BUTTON(keycode)) {
125 report_mouse_t currentReport = pointing_device_get_report();
126 if (record->event.pressed) {
127 currentReport.buttons |= 1 << (keycode - KC_MS_BTN1);
128 } else {
129 currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1));
130 }
131 pointing_device_set_report(currentReport);
132 pointing_device_send();
133 }
134#endif
135
136 return true;
137} 70}
138 71
139// Hardware Setup 72// Hardware Setup
@@ -143,9 +76,6 @@ void keyboard_pre_init_kb(void) {
143 // debug_mouse = true; 76 // debug_mouse = true;
144 // debug_encoder = true; 77 // debug_encoder = true;
145 78
146 setPinInput(OPT_ENC1);
147 setPinInput(OPT_ENC2);
148
149 /* Ground all output pins connected to ground. This provides additional 79 /* Ground all output pins connected to ground. This provides additional
150 * pathways to ground. If you're messing with this, know this: driving ANY 80 * pathways to ground. If you're messing with this, know this: driving ANY
151 * of these pins high will cause a short. On the MCU. Ka-blooey. 81 * of these pins high will cause a short. On the MCU. Ka-blooey.
@@ -162,34 +92,6 @@ void keyboard_pre_init_kb(void) {
162 keyboard_pre_init_user(); 92 keyboard_pre_init_user();
163} 93}
164 94
165void pointing_device_init(void) {
166 adns_init();
167 opt_encoder_init();
168
169 // reboot the adns.
170 // if the adns hasn't initialized yet, this is harmless.
171 adns_write_reg(REG_CHIP_RESET, 0x5a);
172
173 // wait maximum time before adns is ready.
174 // this ensures that the adns is actuall ready after reset.
175 wait_ms(55);
176
177 // read a burst from the adns and then discard it.
178 // gets the adns ready for write commands
179 // (for example, setting the dpi).
180 adns_read_burst();
181
182 // set the DPI.
183 adns_set_cpi(dpi_array[keyboard_config.dpi_config]);
184}
185
186void pointing_device_task(void) {
187 report_mouse_t mouse_report = pointing_device_get_report();
188 process_mouse(&mouse_report);
189 pointing_device_set_report(mouse_report);
190 pointing_device_send();
191}
192
193void eeconfig_init_kb(void) { 95void eeconfig_init_kb(void) {
194 keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT; 96 keyboard_config.dpi_config = PLOOPY_DPI_DEFAULT;
195 eeconfig_update_kb(keyboard_config.raw); 97 eeconfig_update_kb(keyboard_config.raw);
diff --git a/keyboards/ploopyco/trackball_nano/trackball_nano.h b/keyboards/ploopyco/trackball_nano/trackball_nano.h
index 6c8ecace7..88725eab6 100644
--- a/keyboards/ploopyco/trackball_nano/trackball_nano.h
+++ b/keyboards/ploopyco/trackball_nano/trackball_nano.h
@@ -20,19 +20,6 @@
20#pragma once 20#pragma once
21 21
22#include "quantum.h" 22#include "quantum.h"
23#include "drivers/sensors/adns5050.h"
24#include "analog.h"
25#include "opt_encoder.h"
26#include "pointing_device.h"
27
28// Sensor defs
29#define OPT_ENC1 F0
30#define OPT_ENC2 F4
31#define OPT_ENC1_MUX 0
32#define OPT_ENC2_MUX 4
33
34void process_mouse(report_mouse_t* mouse_report);
35void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y);
36 23
37#define LAYOUT(k00) {{ KC_NO }} 24#define LAYOUT(k00) {{ KC_NO }}
38 25
diff --git a/keyboards/tkw/grandiceps/rev2/rules.mk b/keyboards/tkw/grandiceps/rev2/rules.mk
index c8f3f05bd..3e82c4507 100644
--- a/keyboards/tkw/grandiceps/rev2/rules.mk
+++ b/keyboards/tkw/grandiceps/rev2/rules.mk
@@ -1,5 +1,4 @@
1EEPROM_DRIVER = i2c 1EEPROM_DRIVER = i2c
2 2
3POINTING_DEVICE_ENABLE = yes 3POINTING_DEVICE_ENABLE = yes
4SRC += drivers/sensors/pimoroni_trackball.c 4POINTING_DEVICE_DRIVER = pimoroni_trackball
5QUANTUM_LIB_SRC += i2c_master.c