aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/common/mousekey.c
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/common/mousekey.c')
-rw-r--r--tmk_core/common/mousekey.c520
1 files changed, 284 insertions, 236 deletions
diff --git a/tmk_core/common/mousekey.c b/tmk_core/common/mousekey.c
index bb08576b9..2df7728a4 100644
--- a/tmk_core/common/mousekey.c
+++ b/tmk_core/common/mousekey.c
@@ -24,25 +24,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
24#include "mousekey.h" 24#include "mousekey.h"
25 25
26inline int8_t times_inv_sqrt2(int8_t x) { 26inline int8_t times_inv_sqrt2(int8_t x) {
27 // 181/256 is pretty close to 1/sqrt(2) 27 // 181/256 is pretty close to 1/sqrt(2)
28 // 0.70703125 0.707106781 28 // 0.70703125 0.707106781
29 // 1 too small for x=99 and x=198 29 // 1 too small for x=99 and x=198
30 // This ends up being a mult and discard lower 8 bits 30 // This ends up being a mult and discard lower 8 bits
31 return (x * 181) >> 8; 31 return (x * 181) >> 8;
32} 32}
33 33
34static report_mouse_t mouse_report = {0}; 34static report_mouse_t mouse_report = {0};
35static void mousekey_debug(void); 35static void mousekey_debug(void);
36static uint8_t mousekey_accel = 0; 36static uint8_t mousekey_accel = 0;
37static uint8_t mousekey_repeat = 0; 37static uint8_t mousekey_repeat = 0;
38static uint16_t last_timer = 0; 38static uint16_t last_timer = 0;
39
40
41 39
42#ifndef MK_3_SPEED 40#ifndef MK_3_SPEED
43 41
44
45
46/* 42/*
47 * Mouse keys acceleration algorithm 43 * Mouse keys acceleration algorithm
48 * http://en.wikipedia.org/wiki/Mouse_keys 44 * http://en.wikipedia.org/wiki/Mouse_keys
@@ -50,7 +46,7 @@ static uint16_t last_timer = 0;
50 * speed = delta * max_speed * (repeat / time_to_max)**((1000+curve)/1000) 46 * speed = delta * max_speed * (repeat / time_to_max)**((1000+curve)/1000)
51 */ 47 */
52/* milliseconds between the initial key press and first repeated motion event (0-2550) */ 48/* milliseconds between the initial key press and first repeated motion event (0-2550) */
53uint8_t mk_delay = MOUSEKEY_DELAY/10; 49uint8_t mk_delay = MOUSEKEY_DELAY / 10;
54/* milliseconds between repeated motion events (0-255) */ 50/* milliseconds between repeated motion events (0-255) */
55uint8_t mk_interval = MOUSEKEY_INTERVAL; 51uint8_t mk_interval = MOUSEKEY_INTERVAL;
56/* steady speed (in action_delta units) applied each event (0-255) */ 52/* steady speed (in action_delta units) applied each event (0-255) */
@@ -58,268 +54,320 @@ uint8_t mk_max_speed = MOUSEKEY_MAX_SPEED;
58/* number of events (count) accelerating to steady speed (0-255) */ 54/* number of events (count) accelerating to steady speed (0-255) */
59uint8_t mk_time_to_max = MOUSEKEY_TIME_TO_MAX; 55uint8_t mk_time_to_max = MOUSEKEY_TIME_TO_MAX;
60/* ramp used to reach maximum pointer speed (NOT SUPPORTED) */ 56/* ramp used to reach maximum pointer speed (NOT SUPPORTED) */
61//int8_t mk_curve = 0; 57// int8_t mk_curve = 0;
62/* wheel params */ 58/* wheel params */
63uint8_t mk_wheel_max_speed = MOUSEKEY_WHEEL_MAX_SPEED; 59uint8_t mk_wheel_max_speed = MOUSEKEY_WHEEL_MAX_SPEED;
64uint8_t mk_wheel_time_to_max = MOUSEKEY_WHEEL_TIME_TO_MAX; 60uint8_t mk_wheel_time_to_max = MOUSEKEY_WHEEL_TIME_TO_MAX;
65 61
66static uint8_t move_unit(void) { 62static uint8_t move_unit(void) {
67 uint16_t unit; 63 uint16_t unit;
68 if (mousekey_accel & (1<<0)) { 64 if (mousekey_accel & (1 << 0)) {
69 unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed)/4; 65 unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed) / 4;
70 } else if (mousekey_accel & (1<<1)) { 66 } else if (mousekey_accel & (1 << 1)) {
71 unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed)/2; 67 unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed) / 2;
72 } else if (mousekey_accel & (1<<2)) { 68 } else if (mousekey_accel & (1 << 2)) {
73 unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed); 69 unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed);
74 } else if (mousekey_repeat == 0) { 70 } else if (mousekey_repeat == 0) {
75 unit = MOUSEKEY_MOVE_DELTA; 71 unit = MOUSEKEY_MOVE_DELTA;
76 } else if (mousekey_repeat >= mk_time_to_max) { 72 } else if (mousekey_repeat >= mk_time_to_max) {
77 unit = MOUSEKEY_MOVE_DELTA * mk_max_speed; 73 unit = MOUSEKEY_MOVE_DELTA * mk_max_speed;
78 } else { 74 } else {
79 unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed * mousekey_repeat) / mk_time_to_max; 75 unit = (MOUSEKEY_MOVE_DELTA * mk_max_speed * mousekey_repeat) / mk_time_to_max;
80 } 76 }
81 return (unit > MOUSEKEY_MOVE_MAX ? MOUSEKEY_MOVE_MAX : (unit == 0 ? 1 : unit)); 77 return (unit > MOUSEKEY_MOVE_MAX ? MOUSEKEY_MOVE_MAX : (unit == 0 ? 1 : unit));
82} 78}
83 79
84static uint8_t wheel_unit(void) { 80static uint8_t wheel_unit(void) {
85 uint16_t unit; 81 uint16_t unit;
86 if (mousekey_accel & (1<<0)) { 82 if (mousekey_accel & (1 << 0)) {
87 unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed)/4; 83 unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed) / 4;
88 } else if (mousekey_accel & (1<<1)) { 84 } else if (mousekey_accel & (1 << 1)) {
89 unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed)/2; 85 unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed) / 2;
90 } else if (mousekey_accel & (1<<2)) { 86 } else if (mousekey_accel & (1 << 2)) {
91 unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed); 87 unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed);
92 } else if (mousekey_repeat == 0) { 88 } else if (mousekey_repeat == 0) {
93 unit = MOUSEKEY_WHEEL_DELTA; 89 unit = MOUSEKEY_WHEEL_DELTA;
94 } else if (mousekey_repeat >= mk_wheel_time_to_max) { 90 } else if (mousekey_repeat >= mk_wheel_time_to_max) {
95 unit = MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed; 91 unit = MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed;
96 } else { 92 } else {
97 unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed * mousekey_repeat) / mk_wheel_time_to_max; 93 unit = (MOUSEKEY_WHEEL_DELTA * mk_wheel_max_speed * mousekey_repeat) / mk_wheel_time_to_max;
98 } 94 }
99 return (unit > MOUSEKEY_WHEEL_MAX ? MOUSEKEY_WHEEL_MAX : (unit == 0 ? 1 : unit)); 95 return (unit > MOUSEKEY_WHEEL_MAX ? MOUSEKEY_WHEEL_MAX : (unit == 0 ? 1 : unit));
100} 96}
101 97
102void mousekey_task(void) { 98void mousekey_task(void) {
103 if (timer_elapsed(last_timer) < (mousekey_repeat ? mk_interval : mk_delay*10)) { 99 if (timer_elapsed(last_timer) < (mousekey_repeat ? mk_interval : mk_delay * 10)) {
104 return; 100 return;
105 } 101 }
106 if (mouse_report.x == 0 && mouse_report.y == 0 && mouse_report.v == 0 && mouse_report.h == 0) { 102 if (mouse_report.x == 0 && mouse_report.y == 0 && mouse_report.v == 0 && mouse_report.h == 0) {
107 return; 103 return;
108 } 104 }
109 if (mousekey_repeat != UINT8_MAX) mousekey_repeat++; 105 if (mousekey_repeat != UINT8_MAX) mousekey_repeat++;
110 if (mouse_report.x > 0) mouse_report.x = move_unit(); 106 if (mouse_report.x > 0) mouse_report.x = move_unit();
111 if (mouse_report.x < 0) mouse_report.x = move_unit() * -1; 107 if (mouse_report.x < 0) mouse_report.x = move_unit() * -1;
112 if (mouse_report.y > 0) mouse_report.y = move_unit(); 108 if (mouse_report.y > 0) mouse_report.y = move_unit();
113 if (mouse_report.y < 0) mouse_report.y = move_unit() * -1; 109 if (mouse_report.y < 0) mouse_report.y = move_unit() * -1;
114 /* diagonal move [1/sqrt(2)] */ 110 /* diagonal move [1/sqrt(2)] */
115 if (mouse_report.x && mouse_report.y) { 111 if (mouse_report.x && mouse_report.y) {
116 mouse_report.x = times_inv_sqrt2(mouse_report.x); 112 mouse_report.x = times_inv_sqrt2(mouse_report.x);
117 if (mouse_report.x == 0) { mouse_report.x = 1; } 113 if (mouse_report.x == 0) {
118 mouse_report.y = times_inv_sqrt2(mouse_report.y); 114 mouse_report.x = 1;
119 if (mouse_report.y == 0) { mouse_report.y = 1; } 115 }
120 } 116 mouse_report.y = times_inv_sqrt2(mouse_report.y);
121 if (mouse_report.v > 0) mouse_report.v = wheel_unit(); 117 if (mouse_report.y == 0) {
122 if (mouse_report.v < 0) mouse_report.v = wheel_unit() * -1; 118 mouse_report.y = 1;
123 if (mouse_report.h > 0) mouse_report.h = wheel_unit(); 119 }
124 if (mouse_report.h < 0) mouse_report.h = wheel_unit() * -1; 120 }
125 mousekey_send(); 121 if (mouse_report.v > 0) mouse_report.v = wheel_unit();
122 if (mouse_report.v < 0) mouse_report.v = wheel_unit() * -1;
123 if (mouse_report.h > 0) mouse_report.h = wheel_unit();
124 if (mouse_report.h < 0) mouse_report.h = wheel_unit() * -1;
125 mousekey_send();
126} 126}
127 127
128void mousekey_on(uint8_t code) { 128void mousekey_on(uint8_t code) {
129 if (code == KC_MS_UP) mouse_report.y = move_unit() * -1; 129 if (code == KC_MS_UP)
130 else if (code == KC_MS_DOWN) mouse_report.y = move_unit(); 130 mouse_report.y = move_unit() * -1;
131 else if (code == KC_MS_LEFT) mouse_report.x = move_unit() * -1; 131 else if (code == KC_MS_DOWN)
132 else if (code == KC_MS_RIGHT) mouse_report.x = move_unit(); 132 mouse_report.y = move_unit();
133 else if (code == KC_MS_WH_UP) mouse_report.v = wheel_unit(); 133 else if (code == KC_MS_LEFT)
134 else if (code == KC_MS_WH_DOWN) mouse_report.v = wheel_unit() * -1; 134 mouse_report.x = move_unit() * -1;
135 else if (code == KC_MS_WH_LEFT) mouse_report.h = wheel_unit() * -1; 135 else if (code == KC_MS_RIGHT)
136 else if (code == KC_MS_WH_RIGHT) mouse_report.h = wheel_unit(); 136 mouse_report.x = move_unit();
137 else if (code == KC_MS_BTN1) mouse_report.buttons |= MOUSE_BTN1; 137 else if (code == KC_MS_WH_UP)
138 else if (code == KC_MS_BTN2) mouse_report.buttons |= MOUSE_BTN2; 138 mouse_report.v = wheel_unit();
139 else if (code == KC_MS_BTN3) mouse_report.buttons |= MOUSE_BTN3; 139 else if (code == KC_MS_WH_DOWN)
140 else if (code == KC_MS_BTN4) mouse_report.buttons |= MOUSE_BTN4; 140 mouse_report.v = wheel_unit() * -1;
141 else if (code == KC_MS_BTN5) mouse_report.buttons |= MOUSE_BTN5; 141 else if (code == KC_MS_WH_LEFT)
142 else if (code == KC_MS_ACCEL0) mousekey_accel |= (1<<0); 142 mouse_report.h = wheel_unit() * -1;
143 else if (code == KC_MS_ACCEL1) mousekey_accel |= (1<<1); 143 else if (code == KC_MS_WH_RIGHT)
144 else if (code == KC_MS_ACCEL2) mousekey_accel |= (1<<2); 144 mouse_report.h = wheel_unit();
145 else if (code == KC_MS_BTN1)
146 mouse_report.buttons |= MOUSE_BTN1;
147 else if (code == KC_MS_BTN2)
148 mouse_report.buttons |= MOUSE_BTN2;
149 else if (code == KC_MS_BTN3)
150 mouse_report.buttons |= MOUSE_BTN3;
151 else if (code == KC_MS_BTN4)
152 mouse_report.buttons |= MOUSE_BTN4;
153 else if (code == KC_MS_BTN5)
154 mouse_report.buttons |= MOUSE_BTN5;
155 else if (code == KC_MS_ACCEL0)
156 mousekey_accel |= (1 << 0);
157 else if (code == KC_MS_ACCEL1)
158 mousekey_accel |= (1 << 1);
159 else if (code == KC_MS_ACCEL2)
160 mousekey_accel |= (1 << 2);
145} 161}
146 162
147void mousekey_off(uint8_t code) { 163void mousekey_off(uint8_t code) {
148 if (code == KC_MS_UP && mouse_report.y < 0) mouse_report.y = 0; 164 if (code == KC_MS_UP && mouse_report.y < 0)
149 else if (code == KC_MS_DOWN && mouse_report.y > 0) mouse_report.y = 0; 165 mouse_report.y = 0;
150 else if (code == KC_MS_LEFT && mouse_report.x < 0) mouse_report.x = 0; 166 else if (code == KC_MS_DOWN && mouse_report.y > 0)
151 else if (code == KC_MS_RIGHT && mouse_report.x > 0) mouse_report.x = 0; 167 mouse_report.y = 0;
152 else if (code == KC_MS_WH_UP && mouse_report.v > 0) mouse_report.v = 0; 168 else if (code == KC_MS_LEFT && mouse_report.x < 0)
153 else if (code == KC_MS_WH_DOWN && mouse_report.v < 0) mouse_report.v = 0; 169 mouse_report.x = 0;
154 else if (code == KC_MS_WH_LEFT && mouse_report.h < 0) mouse_report.h = 0; 170 else if (code == KC_MS_RIGHT && mouse_report.x > 0)
155 else if (code == KC_MS_WH_RIGHT && mouse_report.h > 0) mouse_report.h = 0; 171 mouse_report.x = 0;
156 else if (code == KC_MS_BTN1) mouse_report.buttons &= ~MOUSE_BTN1; 172 else if (code == KC_MS_WH_UP && mouse_report.v > 0)
157 else if (code == KC_MS_BTN2) mouse_report.buttons &= ~MOUSE_BTN2; 173 mouse_report.v = 0;
158 else if (code == KC_MS_BTN3) mouse_report.buttons &= ~MOUSE_BTN3; 174 else if (code == KC_MS_WH_DOWN && mouse_report.v < 0)
159 else if (code == KC_MS_BTN4) mouse_report.buttons &= ~MOUSE_BTN4; 175 mouse_report.v = 0;
160 else if (code == KC_MS_BTN5) mouse_report.buttons &= ~MOUSE_BTN5; 176 else if (code == KC_MS_WH_LEFT && mouse_report.h < 0)
161 else if (code == KC_MS_ACCEL0) mousekey_accel &= ~(1<<0); 177 mouse_report.h = 0;
162 else if (code == KC_MS_ACCEL1) mousekey_accel &= ~(1<<1); 178 else if (code == KC_MS_WH_RIGHT && mouse_report.h > 0)
163 else if (code == KC_MS_ACCEL2) mousekey_accel &= ~(1<<2); 179 mouse_report.h = 0;
164 if (mouse_report.x == 0 && mouse_report.y == 0 && mouse_report.v == 0 && mouse_report.h == 0) 180 else if (code == KC_MS_BTN1)
165 mousekey_repeat = 0; 181 mouse_report.buttons &= ~MOUSE_BTN1;
182 else if (code == KC_MS_BTN2)
183 mouse_report.buttons &= ~MOUSE_BTN2;
184 else if (code == KC_MS_BTN3)
185 mouse_report.buttons &= ~MOUSE_BTN3;
186 else if (code == KC_MS_BTN4)
187 mouse_report.buttons &= ~MOUSE_BTN4;
188 else if (code == KC_MS_BTN5)
189 mouse_report.buttons &= ~MOUSE_BTN5;
190 else if (code == KC_MS_ACCEL0)
191 mousekey_accel &= ~(1 << 0);
192 else if (code == KC_MS_ACCEL1)
193 mousekey_accel &= ~(1 << 1);
194 else if (code == KC_MS_ACCEL2)
195 mousekey_accel &= ~(1 << 2);
196 if (mouse_report.x == 0 && mouse_report.y == 0 && mouse_report.v == 0 && mouse_report.h == 0) mousekey_repeat = 0;
166} 197}
167 198
199#else /* #ifndef MK_3_SPEED */
168 200
169 201enum { mkspd_unmod, mkspd_0, mkspd_1, mkspd_2, mkspd_COUNT };
170 202# ifndef MK_MOMENTARY_ACCEL
171#else /* #ifndef MK_3_SPEED */ 203static uint8_t mk_speed = mkspd_1;
172 204# else
173 205static uint8_t mk_speed = mkspd_unmod;
174
175enum {
176 mkspd_unmod,
177 mkspd_0,
178 mkspd_1,
179 mkspd_2,
180 mkspd_COUNT
181};
182#ifndef MK_MOMENTARY_ACCEL
183static uint8_t mk_speed = mkspd_1;
184#else
185static uint8_t mk_speed = mkspd_unmod;
186static uint8_t mkspd_DEFAULT = mkspd_unmod; 206static uint8_t mkspd_DEFAULT = mkspd_unmod;
187#endif 207# endif
188static uint16_t last_timer_c = 0; 208static uint16_t last_timer_c = 0;
189static uint16_t last_timer_w = 0; 209static uint16_t last_timer_w = 0;
190uint16_t c_offsets[mkspd_COUNT] = { 210uint16_t c_offsets[mkspd_COUNT] = {MK_C_OFFSET_UNMOD, MK_C_OFFSET_0, MK_C_OFFSET_1, MK_C_OFFSET_2};
191 MK_C_OFFSET_UNMOD, MK_C_OFFSET_0, MK_C_OFFSET_1, MK_C_OFFSET_2 211uint16_t c_intervals[mkspd_COUNT] = {MK_C_INTERVAL_UNMOD, MK_C_INTERVAL_0, MK_C_INTERVAL_1, MK_C_INTERVAL_2};
192}; 212uint16_t w_offsets[mkspd_COUNT] = {MK_W_OFFSET_UNMOD, MK_W_OFFSET_0, MK_W_OFFSET_1, MK_W_OFFSET_2};
193uint16_t c_intervals[mkspd_COUNT] = { 213uint16_t w_intervals[mkspd_COUNT] = {MK_W_INTERVAL_UNMOD, MK_W_INTERVAL_0, MK_W_INTERVAL_1, MK_W_INTERVAL_2};
194 MK_C_INTERVAL_UNMOD, MK_C_INTERVAL_0, MK_C_INTERVAL_1, MK_C_INTERVAL_2
195};
196uint16_t w_offsets[mkspd_COUNT] = {
197 MK_W_OFFSET_UNMOD, MK_W_OFFSET_0, MK_W_OFFSET_1, MK_W_OFFSET_2
198};
199uint16_t w_intervals[mkspd_COUNT] = {
200 MK_W_INTERVAL_UNMOD, MK_W_INTERVAL_0, MK_W_INTERVAL_1, MK_W_INTERVAL_2
201};
202
203 214
204void mousekey_task(void) { 215void mousekey_task(void) {
205 // report cursor and scroll movement independently 216 // report cursor and scroll movement independently
206 report_mouse_t const tmpmr = mouse_report; 217 report_mouse_t const tmpmr = mouse_report;
207 if ((mouse_report.x || mouse_report.y) && timer_elapsed(last_timer_c) > c_intervals[mk_speed]) { 218 if ((mouse_report.x || mouse_report.y) && timer_elapsed(last_timer_c) > c_intervals[mk_speed]) {
208 mouse_report.h = 0; 219 mouse_report.h = 0;
209 mouse_report.v = 0; 220 mouse_report.v = 0;
210 mousekey_send(); 221 mousekey_send();
211 last_timer_c = last_timer; 222 last_timer_c = last_timer;
212 mouse_report = tmpmr; 223 mouse_report = tmpmr;
213 } 224 }
214 if ((mouse_report.h || mouse_report.v) && timer_elapsed(last_timer_w) > w_intervals[mk_speed]) { 225 if ((mouse_report.h || mouse_report.v) && timer_elapsed(last_timer_w) > w_intervals[mk_speed]) {
215 mouse_report.x = 0; 226 mouse_report.x = 0;
216 mouse_report.y = 0; 227 mouse_report.y = 0;
217 mousekey_send(); 228 mousekey_send();
218 last_timer_w = last_timer; 229 last_timer_w = last_timer;
219 mouse_report = tmpmr; 230 mouse_report = tmpmr;
220 } 231 }
221} 232}
222 233
223void adjust_speed(void) { 234void adjust_speed(void) {
224 uint16_t const c_offset = c_offsets[mk_speed]; 235 uint16_t const c_offset = c_offsets[mk_speed];
225 uint16_t const w_offset = w_offsets[mk_speed]; 236 uint16_t const w_offset = w_offsets[mk_speed];
226 if (mouse_report.x > 0) mouse_report.x = c_offset; 237 if (mouse_report.x > 0) mouse_report.x = c_offset;
227 if (mouse_report.x < 0) mouse_report.x = c_offset * -1; 238 if (mouse_report.x < 0) mouse_report.x = c_offset * -1;
228 if (mouse_report.y > 0) mouse_report.y = c_offset; 239 if (mouse_report.y > 0) mouse_report.y = c_offset;
229 if (mouse_report.y < 0) mouse_report.y = c_offset * -1; 240 if (mouse_report.y < 0) mouse_report.y = c_offset * -1;
230 if (mouse_report.h > 0) mouse_report.h = w_offset; 241 if (mouse_report.h > 0) mouse_report.h = w_offset;
231 if (mouse_report.h < 0) mouse_report.h = w_offset * -1; 242 if (mouse_report.h < 0) mouse_report.h = w_offset * -1;
232 if (mouse_report.v > 0) mouse_report.v = w_offset; 243 if (mouse_report.v > 0) mouse_report.v = w_offset;
233 if (mouse_report.v < 0) mouse_report.v = w_offset * -1; 244 if (mouse_report.v < 0) mouse_report.v = w_offset * -1;
234 // adjust for diagonals 245 // adjust for diagonals
235 if (mouse_report.x && mouse_report.y) { 246 if (mouse_report.x && mouse_report.y) {
236 mouse_report.x = times_inv_sqrt2(mouse_report.x); 247 mouse_report.x = times_inv_sqrt2(mouse_report.x);
237 if (mouse_report.x == 0) { mouse_report.x = 1; } 248 if (mouse_report.x == 0) {
238 mouse_report.y = times_inv_sqrt2(mouse_report.y); 249 mouse_report.x = 1;
239 if (mouse_report.y == 0) { mouse_report.y = 1; } 250 }
240 } 251 mouse_report.y = times_inv_sqrt2(mouse_report.y);
241 if (mouse_report.h && mouse_report.v) { 252 if (mouse_report.y == 0) {
242 mouse_report.h = times_inv_sqrt2(mouse_report.h); 253 mouse_report.y = 1;
243 mouse_report.v = times_inv_sqrt2(mouse_report.v); 254 }
244 } 255 }
256 if (mouse_report.h && mouse_report.v) {
257 mouse_report.h = times_inv_sqrt2(mouse_report.h);
258 mouse_report.v = times_inv_sqrt2(mouse_report.v);
259 }
245} 260}
246 261
247void mousekey_on(uint8_t code) { 262void mousekey_on(uint8_t code) {
248 uint16_t const c_offset = c_offsets[mk_speed]; 263 uint16_t const c_offset = c_offsets[mk_speed];
249 uint16_t const w_offset = w_offsets[mk_speed]; 264 uint16_t const w_offset = w_offsets[mk_speed];
250 uint8_t const old_speed = mk_speed; 265 uint8_t const old_speed = mk_speed;
251 if (code == KC_MS_UP) mouse_report.y = c_offset * -1; 266 if (code == KC_MS_UP)
252 else if (code == KC_MS_DOWN) mouse_report.y = c_offset; 267 mouse_report.y = c_offset * -1;
253 else if (code == KC_MS_LEFT) mouse_report.x = c_offset * -1; 268 else if (code == KC_MS_DOWN)
254 else if (code == KC_MS_RIGHT) mouse_report.x = c_offset; 269 mouse_report.y = c_offset;
255 else if (code == KC_MS_WH_UP) mouse_report.v = w_offset; 270 else if (code == KC_MS_LEFT)
256 else if (code == KC_MS_WH_DOWN) mouse_report.v = w_offset * -1; 271 mouse_report.x = c_offset * -1;
257 else if (code == KC_MS_WH_LEFT) mouse_report.h = w_offset * -1; 272 else if (code == KC_MS_RIGHT)
258 else if (code == KC_MS_WH_RIGHT) mouse_report.h = w_offset; 273 mouse_report.x = c_offset;
259 else if (code == KC_MS_BTN1) mouse_report.buttons |= MOUSE_BTN1; 274 else if (code == KC_MS_WH_UP)
260 else if (code == KC_MS_BTN2) mouse_report.buttons |= MOUSE_BTN2; 275 mouse_report.v = w_offset;
261 else if (code == KC_MS_BTN3) mouse_report.buttons |= MOUSE_BTN3; 276 else if (code == KC_MS_WH_DOWN)
262 else if (code == KC_MS_BTN4) mouse_report.buttons |= MOUSE_BTN4; 277 mouse_report.v = w_offset * -1;
263 else if (code == KC_MS_BTN5) mouse_report.buttons |= MOUSE_BTN5; 278 else if (code == KC_MS_WH_LEFT)
264 else if (code == KC_MS_ACCEL0) mk_speed = mkspd_0; 279 mouse_report.h = w_offset * -1;
265 else if (code == KC_MS_ACCEL1) mk_speed = mkspd_1; 280 else if (code == KC_MS_WH_RIGHT)
266 else if (code == KC_MS_ACCEL2) mk_speed = mkspd_2; 281 mouse_report.h = w_offset;
267 if (mk_speed != old_speed) adjust_speed(); 282 else if (code == KC_MS_BTN1)
283 mouse_report.buttons |= MOUSE_BTN1;
284 else if (code == KC_MS_BTN2)
285 mouse_report.buttons |= MOUSE_BTN2;
286 else if (code == KC_MS_BTN3)
287 mouse_report.buttons |= MOUSE_BTN3;
288 else if (code == KC_MS_BTN4)
289 mouse_report.buttons |= MOUSE_BTN4;
290 else if (code == KC_MS_BTN5)
291 mouse_report.buttons |= MOUSE_BTN5;
292 else if (code == KC_MS_ACCEL0)
293 mk_speed = mkspd_0;
294 else if (code == KC_MS_ACCEL1)
295 mk_speed = mkspd_1;
296 else if (code == KC_MS_ACCEL2)
297 mk_speed = mkspd_2;
298 if (mk_speed != old_speed) adjust_speed();
268} 299}
269 300
270void mousekey_off(uint8_t code) { 301void mousekey_off(uint8_t code) {
271#ifdef MK_MOMENTARY_ACCEL 302# ifdef MK_MOMENTARY_ACCEL
272 uint8_t const old_speed = mk_speed; 303 uint8_t const old_speed = mk_speed;
273#endif 304# endif
274 if (code == KC_MS_UP && mouse_report.y < 0) mouse_report.y = 0; 305 if (code == KC_MS_UP && mouse_report.y < 0)
275 else if (code == KC_MS_DOWN && mouse_report.y > 0) mouse_report.y = 0; 306 mouse_report.y = 0;
276 else if (code == KC_MS_LEFT && mouse_report.x < 0) mouse_report.x = 0; 307 else if (code == KC_MS_DOWN && mouse_report.y > 0)
277 else if (code == KC_MS_RIGHT && mouse_report.x > 0) mouse_report.x = 0; 308 mouse_report.y = 0;
278 else if (code == KC_MS_WH_UP && mouse_report.v > 0) mouse_report.v = 0; 309 else if (code == KC_MS_LEFT && mouse_report.x < 0)
279 else if (code == KC_MS_WH_DOWN && mouse_report.v < 0) mouse_report.v = 0; 310 mouse_report.x = 0;
280 else if (code == KC_MS_WH_LEFT && mouse_report.h < 0) mouse_report.h = 0; 311 else if (code == KC_MS_RIGHT && mouse_report.x > 0)
281 else if (code == KC_MS_WH_RIGHT && mouse_report.h > 0) mouse_report.h = 0; 312 mouse_report.x = 0;
282 else if (code == KC_MS_BTN1) mouse_report.buttons &= ~MOUSE_BTN1; 313 else if (code == KC_MS_WH_UP && mouse_report.v > 0)
283 else if (code == KC_MS_BTN2) mouse_report.buttons &= ~MOUSE_BTN2; 314 mouse_report.v = 0;
284 else if (code == KC_MS_BTN3) mouse_report.buttons &= ~MOUSE_BTN3; 315 else if (code == KC_MS_WH_DOWN && mouse_report.v < 0)
285 else if (code == KC_MS_BTN4) mouse_report.buttons &= ~MOUSE_BTN4; 316 mouse_report.v = 0;
286 else if (code == KC_MS_BTN5) mouse_report.buttons &= ~MOUSE_BTN5; 317 else if (code == KC_MS_WH_LEFT && mouse_report.h < 0)
287#ifdef MK_MOMENTARY_ACCEL 318 mouse_report.h = 0;
288 else if (code == KC_MS_ACCEL0) mk_speed = mkspd_DEFAULT; 319 else if (code == KC_MS_WH_RIGHT && mouse_report.h > 0)
289 else if (code == KC_MS_ACCEL1) mk_speed = mkspd_DEFAULT; 320 mouse_report.h = 0;
290 else if (code == KC_MS_ACCEL2) mk_speed = mkspd_DEFAULT; 321 else if (code == KC_MS_BTN1)
291 if (mk_speed != old_speed) adjust_speed(); 322 mouse_report.buttons &= ~MOUSE_BTN1;
292#endif 323 else if (code == KC_MS_BTN2)
324 mouse_report.buttons &= ~MOUSE_BTN2;
325 else if (code == KC_MS_BTN3)
326 mouse_report.buttons &= ~MOUSE_BTN3;
327 else if (code == KC_MS_BTN4)
328 mouse_report.buttons &= ~MOUSE_BTN4;
329 else if (code == KC_MS_BTN5)
330 mouse_report.buttons &= ~MOUSE_BTN5;
331# ifdef MK_MOMENTARY_ACCEL
332 else if (code == KC_MS_ACCEL0)
333 mk_speed = mkspd_DEFAULT;
334 else if (code == KC_MS_ACCEL1)
335 mk_speed = mkspd_DEFAULT;
336 else if (code == KC_MS_ACCEL2)
337 mk_speed = mkspd_DEFAULT;
338 if (mk_speed != old_speed) adjust_speed();
339# endif
293} 340}
294 341
295
296
297
298#endif /* #ifndef MK_3_SPEED */ 342#endif /* #ifndef MK_3_SPEED */
299 343
300
301
302
303void mousekey_send(void) { 344void mousekey_send(void) {
304 mousekey_debug(); 345 mousekey_debug();
305 host_mouse_send(&mouse_report); 346 host_mouse_send(&mouse_report);
306 last_timer = timer_read(); 347 last_timer = timer_read();
307} 348}
308 349
309void mousekey_clear(void) { 350void mousekey_clear(void) {
310 mouse_report = (report_mouse_t){}; 351 mouse_report = (report_mouse_t){};
311 mousekey_repeat = 0; 352 mousekey_repeat = 0;
312 mousekey_accel = 0; 353 mousekey_accel = 0;
313} 354}
314 355
315static void mousekey_debug(void) { 356static void mousekey_debug(void) {
316 if (!debug_mouse) return; 357 if (!debug_mouse) return;
317 print("mousekey [btn|x y v h](rep/acl): ["); 358 print("mousekey [btn|x y v h](rep/acl): [");
318 phex(mouse_report.buttons); print("|"); 359 phex(mouse_report.buttons);
319 print_decs(mouse_report.x); print(" "); 360 print("|");
320 print_decs(mouse_report.y); print(" "); 361 print_decs(mouse_report.x);
321 print_decs(mouse_report.v); print(" "); 362 print(" ");
322 print_decs(mouse_report.h); print("]("); 363 print_decs(mouse_report.y);
323 print_dec(mousekey_repeat); print("/"); 364 print(" ");
324 print_dec(mousekey_accel); print(")\n"); 365 print_decs(mouse_report.v);
366 print(" ");
367 print_decs(mouse_report.h);
368 print("](");
369 print_dec(mousekey_repeat);
370 print("/");
371 print_dec(mousekey_accel);
372 print(")\n");
325} 373}