diff options
| author | Drashna Jaelre <drashna@live.com> | 2021-11-14 22:03:24 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-14 22:03:24 -0800 |
| commit | 56e3f06a26851976e559aacf7a096c61403304be (patch) | |
| tree | 1e9ec98ad239fdd241e77ac4c4822fc2721a9cea /keyboards | |
| parent | 462c3a615113e84ac3ca837a5caeb928c0ec8505 (diff) | |
| download | qmk_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')
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 | ||
| 21 | typedef struct { | 22 | #define ANALOG_JOYSTICK_CLICK_PIN E6 |
| 22 | /* 100 - 12000 CPI supported */ | ||
| 23 | uint16_t cpi; | ||
| 24 | } config_pmw_t; | ||
| 25 | |||
| 26 | typedef struct { | ||
| 27 | int16_t x; | ||
| 28 | int16_t y; | ||
| 29 | } report_pmw_t; | ||
| 30 | |||
| 31 | void pmw_init(void); | ||
| 32 | config_pmw_t pmw_get_config(void); | ||
| 33 | void pmw_set_config(config_pmw_t); | ||
| 34 | /* Reads and clears the current delta values on the PMW sensor */ | ||
| 35 | report_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 | ||
| 37 | uint8_t swPin = E6; // SW | ||
| 38 | |||
| 39 | // Set Parameters | ||
| 40 | uint16_t minAxisValue = 0; | ||
| 41 | uint16_t maxAxisValue = 1023; | ||
| 42 | |||
| 43 | uint8_t maxCursorSpeed = 2; | ||
| 44 | uint8_t precisionSpeed = 1; | ||
| 45 | uint8_t speedRegulator = 20; // Lower Values Create Faster Movement | ||
| 46 | |||
| 47 | int8_t xPolarity = 1; | ||
| 48 | int8_t yPolarity = 1; | ||
| 49 | |||
| 50 | uint8_t cursorTimeout = 10; | ||
| 51 | |||
| 52 | int16_t xOrigin, yOrigin; | ||
| 53 | |||
| 54 | uint16_t lastCursor = 0; | ||
| 55 | |||
| 56 | int16_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 | |||
| 86 | int8_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 | |||
| 100 | void 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 | |||
| 120 | void 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 @@ | |||
| 1 | POINTING_DEVICE_ENABLE = yes | 1 | POINTING_DEVICE_ENABLE = yes |
| 2 | RGBLIGHT_ENABLE = no | 2 | POINTING_DEVICE_DRIVER = analog_joystick |
| 3 | CONSOLE_ENABLE = no | 3 | RGBLIGHT_ENABLE = no |
| 4 | CONSOLE_ENABLE = no | ||
| 4 | 5 | ||
| 5 | BOOTLOADER = qmk-dfu | 6 | BOOTLOADER = qmk-dfu |
| 6 | |||
| 7 | SRC += 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 | ||
| 177 | void process_mouse_user(report_mouse_t* mouse_report, int8_t x, int8_t y) { | 177 | report_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 | ||
| 197 | void matrix_scan_keymap(void) { | 202 | void 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 | |||
| 16 | SWAP_HANDS_ENABLE = yes | 16 | SWAP_HANDS_ENABLE = yes |
| 17 | 17 | ||
| 18 | POINTING_DEVICE_ENABLE = yes | 18 | POINTING_DEVICE_ENABLE = yes |
| 19 | POINTING_DEVICE_DRIVER = pmw3360 | ||
| 19 | MOUSE_SHARED_EP = no | 20 | MOUSE_SHARED_EP = no |
| 20 | 21 | ||
| 21 | SPLIT_KEYBOARD = yes | 22 | SPLIT_KEYBOARD = yes |
| 22 | 23 | ||
| 23 | SRC += drivers/sensors/pmw3360.c | 24 | QUANTUM_LIB_SRC += tm_sync.c |
| 24 | QUANTUM_LIB_SRC += spi_master.c tm_sync.c | ||
| 25 | 25 | ||
| 26 | DEFAULT_FOLDER = handwired/tractyl_manuform/5x6_right/teensy2pp | 26 | DEFAULT_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 | ||
| 22 | kb_config_data_t kb_config; | 21 | kb_config_data_t kb_config; |
| 23 | kb_mouse_report_t sync_mouse_report; | 22 | kb_mouse_report_t sync_mouse_report; |
| @@ -82,6 +81,6 @@ void housekeeping_task_sync(void) { | |||
| 82 | void trackball_set_cpi(uint16_t cpi) { | 81 | void 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; | |||
| 34 | uint16_t dpi_array[] = TRACKBALL_DPI_OPTIONS; | 34 | uint16_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 | ||
| 37 | bool BurstState = false; // init burst state for Trackball module | ||
| 38 | uint16_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 | ||
| 87 | bool process_record_kb(uint16_t keycode, keyrecord_t* record) { | 39 | bool 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 |
| 148 | void pointing_device_init(void) { | 96 | void 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 | ||
| 156 | void pointing_device_task(void) { | 101 | report_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" | 19 | extern const pointing_device_driver_t pointing_device_driver; |
| 20 | |||
| 21 | #define CLAMP_HID(value) value < -127 ? -127 : value > 127 ? 127 : value | ||
| 22 | 20 | ||
| 23 | static bool scroll_pressed; | 21 | static bool scroll_pressed; |
| 24 | static bool mouse_buttons_dirty; | 22 | static bool mouse_buttons_dirty; |
| 25 | static int8_t scroll_h; | 23 | static int8_t scroll_h; |
| 26 | static int8_t scroll_v; | 24 | static int8_t scroll_v; |
| 27 | 25 | ||
| 28 | void pointing_device_init(void){ | 26 | void 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 | ||
| 47 | void pointing_device_task(void){ | 43 | report_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 | ||
| 97 | static void on_cpi_button(uint16_t cpi, keyrecord_t *record) { | 77 | static 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 | |||
| 86 | extern const uint16_t pmw_firmware_length; | ||
| 87 | extern const uint8_t pmw_firmware_data[]; | ||
| 88 | |||
| 89 | void pmw_spi_start(void){ | ||
| 90 | spi_start(SPI_SS_PIN, false, SPI_MODE, SPI_DIVISOR); | ||
| 91 | } | ||
| 92 | |||
| 93 | void 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 | |||
| 102 | uint8_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 | |||
| 113 | void 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 | |||
| 173 | config_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 | |||
| 178 | void 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 | |||
| 183 | static 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 | |||
| 195 | report_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 | |||
| 5 | const uint16_t pmw_firmware_length = 4094; | ||
| 6 | |||
| 7 | const uint8_t pmw_firmware_data[] PROGMEM = { | ||
| 8 | 0x01, 0x04, 0x8e, 0x96, 0x6e, 0x77, 0x3e, 0xfe, 0x7e, 0x5f, 0x1d, 0xb8, 0xf2, 0x66, 0x4e, | ||
| 9 | 0xff, 0x5d, 0x19, 0xb0, 0xc2, 0x04, 0x69, 0x54, 0x2a, 0xd6, 0x2e, 0xbf, 0xdd, 0x19, 0xb0, | ||
| 10 | 0xc3, 0xe5, 0x29, 0xb1, 0xe0, 0x23, 0xa5, 0xa9, 0xb1, 0xc1, 0x00, 0x82, 0x67, 0x4c, 0x1a, | ||
| 11 | 0x97, 0x8d, 0x79, 0x51, 0x20, 0xc7, 0x06, 0x8e, 0x7c, 0x7c, 0x7a, 0x76, 0x4f, 0xfd, 0x59, | ||
| 12 | 0x30, 0xe2, 0x46, 0x0e, 0x9e, 0xbe, 0xdf, 0x1d, 0x99, 0x91, 0xa0, 0xa5, 0xa1, 0xa9, 0xd0, | ||
| 13 | 0x22, 0xc6, 0xef, 0x5c, 0x1b, 0x95, 0x89, 0x90, 0xa2, 0xa7, 0xcc, 0xfb, 0x55, 0x28, 0xb3, | ||
| 14 | 0xe4, 0x4a, 0xf7, 0x6c, 0x3b, 0xf4, 0x6a, 0x56, 0x2e, 0xde, 0x1f, 0x9d, 0xb8, 0xd3, 0x05, | ||
| 15 | 0x88, 0x92, 0xa6, 0xce, 0x1e, 0xbe, 0xdf, 0x1d, 0x99, 0xb0, 0xe2, 0x46, 0xef, 0x5c, 0x07, | ||
| 16 | 0x11, 0x5d, 0x98, 0x0b, 0x9d, 0x94, 0x97, 0xee, 0x4e, 0x45, 0x33, 0x6b, 0x44, 0xc7, 0x29, | ||
| 17 | 0x56, 0x27, 0x30, 0xc6, 0xa7, 0xd5, 0xf2, 0x56, 0xdf, 0xb4, 0x38, 0x62, 0xcb, 0xa0, 0xb6, | ||
| 18 | 0xe3, 0x0f, 0x84, 0x06, 0x24, 0x05, 0x65, 0x6f, 0x76, 0x89, 0xb5, 0x77, 0x41, 0x27, 0x82, | ||
| 19 | 0x66, 0x65, 0x82, 0xcc, 0xd5, 0xe6, 0x20, 0xd5, 0x27, 0x17, 0xc5, 0xf8, 0x03, 0x23, 0x7c, | ||
| 20 | 0x5f, 0x64, 0xa5, 0x1d, 0xc1, 0xd6, 0x36, 0xcb, 0x4c, 0xd4, 0xdb, 0x66, 0xd7, 0x8b, 0xb1, | ||
| 21 | 0x99, 0x7e, 0x6f, 0x4c, 0x36, 0x40, 0x06, 0xd6, 0xeb, 0xd7, 0xa2, 0xe4, 0xf4, 0x95, 0x51, | ||
| 22 | 0x5a, 0x54, 0x96, 0xd5, 0x53, 0x44, 0xd7, 0x8c, 0xe0, 0xb9, 0x40, 0x68, 0xd2, 0x18, 0xe9, | ||
| 23 | 0xdd, 0x9a, 0x23, 0x92, 0x48, 0xee, 0x7f, 0x43, 0xaf, 0xea, 0x77, 0x38, 0x84, 0x8c, 0x0a, | ||
| 24 | 0x72, 0xaf, 0x69, 0xf8, 0xdd, 0xf1, 0x24, 0x83, 0xa3, 0xf8, 0x4a, 0xbf, 0xf5, 0x94, 0x13, | ||
| 25 | 0xdb, 0xbb, 0xd8, 0xb4, 0xb3, 0xa0, 0xfb, 0x45, 0x50, 0x60, 0x30, 0x59, 0x12, 0x31, 0x71, | ||
| 26 | 0xa2, 0xd3, 0x13, 0xe7, 0xfa, 0xe7, 0xce, 0x0f, 0x63, 0x15, 0x0b, 0x6b, 0x94, 0xbb, 0x37, | ||
| 27 | 0x83, 0x26, 0x05, 0x9d, 0xfb, 0x46, 0x92, 0xfc, 0x0a, 0x15, 0xd1, 0x0d, 0x73, 0x92, 0xd6, | ||
| 28 | 0x8c, 0x1b, 0x8c, 0xb8, 0x55, 0x8a, 0xce, 0xbd, 0xfe, 0x8e, 0xfc, 0xed, 0x09, 0x12, 0x83, | ||
| 29 | 0x91, 0x82, 0x51, 0x31, 0x23, 0xfb, 0xb4, 0x0c, 0x76, 0xad, 0x7c, 0xd9, 0xb4, 0x4b, 0xb2, | ||
| 30 | 0x67, 0x14, 0x09, 0x9c, 0x7f, 0x0c, 0x18, 0xba, 0x3b, 0xd6, 0x8e, 0x14, 0x2a, 0xe4, 0x1b, | ||
| 31 | 0x52, 0x9f, 0x2b, 0x7d, 0xe1, 0xfb, 0x6a, 0x33, 0x02, 0xfa, 0xac, 0x5a, 0xf2, 0x3e, 0x88, | ||
| 32 | 0x7e, 0xae, 0xd1, 0xf3, 0x78, 0xe8, 0x05, 0xd1, 0xe3, 0xdc, 0x21, 0xf6, 0xe1, 0x9a, 0xbd, | ||
| 33 | 0x17, 0x0e, 0xd9, 0x46, 0x9b, 0x88, 0x03, 0xea, 0xf6, 0x66, 0xbe, 0x0e, 0x1b, 0x50, 0x49, | ||
| 34 | 0x96, 0x40, 0x97, 0xf1, 0xf1, 0xe4, 0x80, 0xa6, 0x6e, 0xe8, 0x77, 0x34, 0xbf, 0x29, 0x40, | ||
| 35 | 0x44, 0xc2, 0xff, 0x4e, 0x98, 0xd3, 0x9c, 0xa3, 0x32, 0x2b, 0x76, 0x51, 0x04, 0x09, 0xe7, | ||
| 36 | 0xa9, 0xd1, 0xa6, 0x32, 0xb1, 0x23, 0x53, 0xe2, 0x47, 0xab, 0xd6, 0xf5, 0x69, 0x5c, 0x3e, | ||
| 37 | 0x5f, 0xfa, 0xae, 0x45, 0x20, 0xe5, 0xd2, 0x44, 0xff, 0x39, 0x32, 0x6d, 0xfd, 0x27, 0x57, | ||
| 38 | 0x5c, 0xfd, 0xf0, 0xde, 0xc1, 0xb5, 0x99, 0xe5, 0xf5, 0x1c, 0x77, 0x01, 0x75, 0xc5, 0x6d, | ||
| 39 | 0x58, 0x92, 0xf2, 0xb2, 0x47, 0x00, 0x01, 0x26, 0x96, 0x7a, 0x30, 0xff, 0xb7, 0xf0, 0xef, | ||
| 40 | 0x77, 0xc1, 0x8a, 0x5d, 0xdc, 0xc0, 0xd1, 0x29, 0x30, 0x1e, 0x77, 0x38, 0x7a, 0x94, 0xf1, | ||
| 41 | 0xb8, 0x7a, 0x7e, 0xef, 0xa4, 0xd1, 0xac, 0x31, 0x4a, 0xf2, 0x5d, 0x64, 0x3d, 0xb2, 0xe2, | ||
| 42 | 0xf0, 0x08, 0x99, 0xfc, 0x70, 0xee, 0x24, 0xa7, 0x7e, 0xee, 0x1e, 0x20, 0x69, 0x7d, 0x44, | ||
| 43 | 0xbf, 0x87, 0x42, 0xdf, 0x88, 0x3b, 0x0c, 0xda, 0x42, 0xc9, 0x04, 0xf9, 0x45, 0x50, 0xfc, | ||
| 44 | 0x83, 0x8f, 0x11, 0x6a, 0x72, 0xbc, 0x99, 0x95, 0xf0, 0xac, 0x3d, 0xa7, 0x3b, 0xcd, 0x1c, | ||
| 45 | 0xe2, 0x88, 0x79, 0x37, 0x11, 0x5f, 0x39, 0x89, 0x95, 0x0a, 0x16, 0x84, 0x7a, 0xf6, 0x8a, | ||
| 46 | 0xa4, 0x28, 0xe4, 0xed, 0x83, 0x80, 0x3b, 0xb1, 0x23, 0xa5, 0x03, 0x10, 0xf4, 0x66, 0xea, | ||
| 47 | 0xbb, 0x0c, 0x0f, 0xc5, 0xec, 0x6c, 0x69, 0xc5, 0xd3, 0x24, 0xab, 0xd4, 0x2a, 0xb7, 0x99, | ||
| 48 | 0x88, 0x76, 0x08, 0xa0, 0xa8, 0x95, 0x7c, 0xd8, 0x38, 0x6d, 0xcd, 0x59, 0x02, 0x51, 0x4b, | ||
| 49 | 0xf1, 0xb5, 0x2b, 0x50, 0xe3, 0xb6, 0xbd, 0xd0, 0x72, 0xcf, 0x9e, 0xfd, 0x6e, 0xbb, 0x44, | ||
| 50 | 0xc8, 0x24, 0x8a, 0x77, 0x18, 0x8a, 0x13, 0x06, 0xef, 0x97, 0x7d, 0xfa, 0x81, 0xf0, 0x31, | ||
| 51 | 0xe6, 0xfa, 0x77, 0xed, 0x31, 0x06, 0x31, 0x5b, 0x54, 0x8a, 0x9f, 0x30, 0x68, 0xdb, 0xe2, | ||
| 52 | 0x40, 0xf8, 0x4e, 0x73, 0xfa, 0xab, 0x74, 0x8b, 0x10, 0x58, 0x13, 0xdc, 0xd2, 0xe6, 0x78, | ||
| 53 | 0xd1, 0x32, 0x2e, 0x8a, 0x9f, 0x2c, 0x58, 0x06, 0x48, 0x27, 0xc5, 0xa9, 0x5e, 0x81, 0x47, | ||
| 54 | 0x89, 0x46, 0x21, 0x91, 0x03, 0x70, 0xa4, 0x3e, 0x88, 0x9c, 0xda, 0x33, 0x0a, 0xce, 0xbc, | ||
| 55 | 0x8b, 0x8e, 0xcf, 0x9f, 0xd3, 0x71, 0x80, 0x43, 0xcf, 0x6b, 0xa9, 0x51, 0x83, 0x76, 0x30, | ||
| 56 | 0x82, 0xc5, 0x6a, 0x85, 0x39, 0x11, 0x50, 0x1a, 0x82, 0xdc, 0x1e, 0x1c, 0xd5, 0x7d, 0xa9, | ||
| 57 | 0x71, 0x99, 0x33, 0x47, 0x19, 0x97, 0xb3, 0x5a, 0xb1, 0xdf, 0xed, 0xa4, 0xf2, 0xe6, 0x26, | ||
| 58 | 0x84, 0xa2, 0x28, 0x9a, 0x9e, 0xdf, 0xa6, 0x6a, 0xf4, 0xd6, 0xfc, 0x2e, 0x5b, 0x9d, 0x1a, | ||
| 59 | 0x2a, 0x27, 0x68, 0xfb, 0xc1, 0x83, 0x21, 0x4b, 0x90, 0xe0, 0x36, 0xdd, 0x5b, 0x31, 0x42, | ||
| 60 | 0x55, 0xa0, 0x13, 0xf7, 0xd0, 0x89, 0x53, 0x71, 0x99, 0x57, 0x09, 0x29, 0xc5, 0xf3, 0x21, | ||
| 61 | 0xf8, 0x37, 0x2f, 0x40, 0xf3, 0xd4, 0xaf, 0x16, 0x08, 0x36, 0x02, 0xfc, 0x77, 0xc5, 0x8b, | ||
| 62 | 0x04, 0x90, 0x56, 0xb9, 0xc9, 0x67, 0x9a, 0x99, 0xe8, 0x00, 0xd3, 0x86, 0xff, 0x97, 0x2d, | ||
| 63 | 0x08, 0xe9, 0xb7, 0xb3, 0x91, 0xbc, 0xdf, 0x45, 0xc6, 0xed, 0x0f, 0x8c, 0x4c, 0x1e, 0xe6, | ||
| 64 | 0x5b, 0x6e, 0x38, 0x30, 0xe4, 0xaa, 0xe3, 0x95, 0xde, 0xb9, 0xe4, 0x9a, 0xf5, 0xb2, 0x55, | ||
| 65 | 0x9a, 0x87, 0x9b, 0xf6, 0x6a, 0xb2, 0xf2, 0x77, 0x9a, 0x31, 0xf4, 0x7a, 0x31, 0xd1, 0x1d, | ||
| 66 | 0x04, 0xc0, 0x7c, 0x32, 0xa2, 0x9e, 0x9a, 0xf5, 0x62, 0xf8, 0x27, 0x8d, 0xbf, 0x51, 0xff, | ||
| 67 | 0xd3, 0xdf, 0x64, 0x37, 0x3f, 0x2a, 0x6f, 0x76, 0x3a, 0x7d, 0x77, 0x06, 0x9e, 0x77, 0x7f, | ||
| 68 | 0x5e, 0xeb, 0x32, 0x51, 0xf9, 0x16, 0x66, 0x9a, 0x09, 0xf3, 0xb0, 0x08, 0xa4, 0x70, 0x96, | ||
| 69 | 0x46, 0x30, 0xff, 0xda, 0x4f, 0xe9, 0x1b, 0xed, 0x8d, 0xf8, 0x74, 0x1f, 0x31, 0x92, 0xb3, | ||
| 70 | 0x73, 0x17, 0x36, 0xdb, 0x91, 0x30, 0xd6, 0x88, 0x55, 0x6b, 0x34, 0x77, 0x87, 0x7a, 0xe7, | ||
| 71 | 0xee, 0x06, 0xc6, 0x1c, 0x8c, 0x19, 0x0c, 0x48, 0x46, 0x23, 0x5e, 0x9c, 0x07, 0x5c, 0xbf, | ||
| 72 | 0xb4, 0x7e, 0xd6, 0x4f, 0x74, 0x9c, 0xe2, 0xc5, 0x50, 0x8b, 0xc5, 0x8b, 0x15, 0x90, 0x60, | ||
| 73 | 0x62, 0x57, 0x29, 0xd0, 0x13, 0x43, 0xa1, 0x80, 0x88, 0x91, 0x00, 0x44, 0xc7, 0x4d, 0x19, | ||
| 74 | 0x86, 0xcc, 0x2f, 0x2a, 0x75, 0x5a, 0xfc, 0xeb, 0x97, 0x2a, 0x70, 0xe3, 0x78, 0xd8, 0x91, | ||
| 75 | 0xb0, 0x4f, 0x99, 0x07, 0xa3, 0x95, 0xea, 0x24, 0x21, 0xd5, 0xde, 0x51, 0x20, 0x93, 0x27, | ||
| 76 | 0x0a, 0x30, 0x73, 0xa8, 0xff, 0x8a, 0x97, 0xe9, 0xa7, 0x6a, 0x8e, 0x0d, 0xe8, 0xf0, 0xdf, | ||
| 77 | 0xec, 0xea, 0xb4, 0x6c, 0x1d, 0x39, 0x2a, 0x62, 0x2d, 0x3d, 0x5a, 0x8b, 0x65, 0xf8, 0x90, | ||
| 78 | 0x05, 0x2e, 0x7e, 0x91, 0x2c, 0x78, 0xef, 0x8e, 0x7a, 0xc1, 0x2f, 0xac, 0x78, 0xee, 0xaf, | ||
| 79 | 0x28, 0x45, 0x06, 0x4c, 0x26, 0xaf, 0x3b, 0xa2, 0xdb, 0xa3, 0x93, 0x06, 0xb5, 0x3c, 0xa5, | ||
| 80 | 0xd8, 0xee, 0x8f, 0xaf, 0x25, 0xcc, 0x3f, 0x85, 0x68, 0x48, 0xa9, 0x62, 0xcc, 0x97, 0x8f, | ||
| 81 | 0x7f, 0x2a, 0xea, 0xe0, 0x15, 0x0a, 0xad, 0x62, 0x07, 0xbd, 0x45, 0xf8, 0x41, 0xd8, 0x36, | ||
| 82 | 0xcb, 0x4c, 0xdb, 0x6e, 0xe6, 0x3a, 0xe7, 0xda, 0x15, 0xe9, 0x29, 0x1e, 0x12, 0x10, 0xa0, | ||
| 83 | 0x14, 0x2c, 0x0e, 0x3d, 0xf4, 0xbf, 0x39, 0x41, 0x92, 0x75, 0x0b, 0x25, 0x7b, 0xa3, 0xce, | ||
| 84 | 0x39, 0x9c, 0x15, 0x64, 0xc8, 0xfa, 0x3d, 0xef, 0x73, 0x27, 0xfe, 0x26, 0x2e, 0xce, 0xda, | ||
| 85 | 0x6e, 0xfd, 0x71, 0x8e, 0xdd, 0xfe, 0x76, 0xee, 0xdc, 0x12, 0x5c, 0x02, 0xc5, 0x3a, 0x4e, | ||
| 86 | 0x4e, 0x4f, 0xbf, 0xca, 0x40, 0x15, 0xc7, 0x6e, 0x8d, 0x41, 0xf1, 0x10, 0xe0, 0x4f, 0x7e, | ||
| 87 | 0x97, 0x7f, 0x1c, 0xae, 0x47, 0x8e, 0x6b, 0xb1, 0x25, 0x31, 0xb0, 0x73, 0xc7, 0x1b, 0x97, | ||
| 88 | 0x79, 0xf9, 0x80, 0xd3, 0x66, 0x22, 0x30, 0x07, 0x74, 0x1e, 0xe4, 0xd0, 0x80, 0x21, 0xd6, | ||
| 89 | 0xee, 0x6b, 0x6c, 0x4f, 0xbf, 0xf5, 0xb7, 0xd9, 0x09, 0x87, 0x2f, 0xa9, 0x14, 0xbe, 0x27, | ||
| 90 | 0xd9, 0x72, 0x50, 0x01, 0xd4, 0x13, 0x73, 0xa6, 0xa7, 0x51, 0x02, 0x75, 0x25, 0xe1, 0xb3, | ||
| 91 | 0x45, 0x34, 0x7d, 0xa8, 0x8e, 0xeb, 0xf3, 0x16, 0x49, 0xcb, 0x4f, 0x8c, 0xa1, 0xb9, 0x36, | ||
| 92 | 0x85, 0x39, 0x75, 0x5d, 0x08, 0x00, 0xae, 0xeb, 0xf6, 0xea, 0xd7, 0x13, 0x3a, 0x21, 0x5a, | ||
| 93 | 0x5f, 0x30, 0x84, 0x52, 0x26, 0x95, 0xc9, 0x14, 0xf2, 0x57, 0x55, 0x6b, 0xb1, 0x10, 0xc2, | ||
| 94 | 0xe1, 0xbd, 0x3b, 0x51, 0xc0, 0xb7, 0x55, 0x4c, 0x71, 0x12, 0x26, 0xc7, 0x0d, 0xf9, 0x51, | ||
| 95 | 0xa4, 0x38, 0x02, 0x05, 0x7f, 0xb8, 0xf1, 0x72, 0x4b, 0xbf, 0x71, 0x89, 0x14, 0xf3, 0x77, | ||
| 96 | 0x38, 0xd9, 0x71, 0x24, 0xf3, 0x00, 0x11, 0xa1, 0xd8, 0xd4, 0x69, 0x27, 0x08, 0x37, 0x35, | ||
| 97 | 0xc9, 0x11, 0x9d, 0x90, 0x1c, 0x0e, 0xe7, 0x1c, 0xff, 0x2d, 0x1e, 0xe8, 0x92, 0xe1, 0x18, | ||
| 98 | 0x10, 0x95, 0x7c, 0xe0, 0x80, 0xf4, 0x96, 0x43, 0x21, 0xf9, 0x75, 0x21, 0x64, 0x38, 0xdd, | ||
| 99 | 0x9f, 0x1e, 0x95, 0x16, 0xda, 0x56, 0x1d, 0x4f, 0x9a, 0x53, 0xb2, 0xe2, 0xe4, 0x18, 0xcb, | ||
| 100 | 0x6b, 0x1a, 0x65, 0xeb, 0x56, 0xc6, 0x3b, 0xe5, 0xfe, 0xd8, 0x26, 0x3f, 0x3a, 0x84, 0x59, | ||
| 101 | 0x72, 0x66, 0xa2, 0xf3, 0x75, 0xff, 0xfb, 0x60, 0xb3, 0x22, 0xad, 0x3f, 0x2d, 0x6b, 0xf9, | ||
| 102 | 0xeb, 0xea, 0x05, 0x7c, 0xd8, 0x8f, 0x6d, 0x2c, 0x98, 0x9e, 0x2b, 0x93, 0xf1, 0x5e, 0x46, | ||
| 103 | 0xf0, 0x87, 0x49, 0x29, 0x73, 0x68, 0xd7, 0x7f, 0xf9, 0xf0, 0xe5, 0x7d, 0xdb, 0x1d, 0x75, | ||
| 104 | 0x19, 0xf3, 0xc4, 0x58, 0x9b, 0x17, 0x88, 0xa8, 0x92, 0xe0, 0xbe, 0xbd, 0x8b, 0x1d, 0x8d, | ||
| 105 | 0x9f, 0x56, 0x76, 0xad, 0xaf, 0x29, 0xe2, 0xd9, 0xd5, 0x52, 0xf6, 0xb5, 0x56, 0x35, 0x57, | ||
| 106 | 0x3a, 0xc8, 0xe1, 0x56, 0x43, 0x19, 0x94, 0xd3, 0x04, 0x9b, 0x6d, 0x35, 0xd8, 0x0b, 0x5f, | ||
| 107 | 0x4d, 0x19, 0x8e, 0xec, 0xfa, 0x64, 0x91, 0x0a, 0x72, 0x20, 0x2b, 0xbc, 0x1a, 0x4a, 0xfe, | ||
| 108 | 0x8b, 0xfd, 0xbb, 0xed, 0x1b, 0x23, 0xea, 0xad, 0x72, 0x82, 0xa1, 0x29, 0x99, 0x71, 0xbd, | ||
| 109 | 0xf0, 0x95, 0xc1, 0x03, 0xdd, 0x7b, 0xc2, 0xb2, 0x3c, 0x28, 0x54, 0xd3, 0x68, 0xa4, 0x72, | ||
| 110 | 0xc8, 0x66, 0x96, 0xe0, 0xd1, 0xd8, 0x7f, 0xf8, 0xd1, 0x26, 0x2b, 0xf7, 0xad, 0xba, 0x55, | ||
| 111 | 0xca, 0x15, 0xb9, 0x32, 0xc3, 0xe5, 0x88, 0x97, 0x8e, 0x5c, 0xfb, 0x92, 0x25, 0x8b, 0xbf, | ||
| 112 | 0xa2, 0x45, 0x55, 0x7a, 0xa7, 0x6f, 0x8b, 0x57, 0x5b, 0xcf, 0x0e, 0xcb, 0x1d, 0xfb, 0x20, | ||
| 113 | 0x82, 0x77, 0xa8, 0x8c, 0xcc, 0x16, 0xce, 0x1d, 0xfa, 0xde, 0xcc, 0x0b, 0x62, 0xfe, 0xcc, | ||
| 114 | 0xe1, 0xb7, 0xf0, 0xc3, 0x81, 0x64, 0x73, 0x40, 0xa0, 0xc2, 0x4d, 0x89, 0x11, 0x75, 0x33, | ||
| 115 | 0x55, 0x33, 0x8d, 0xe8, 0x4a, 0xfd, 0xea, 0x6e, 0x30, 0x0b, 0xd7, 0x31, 0x2c, 0xde, 0x47, | ||
| 116 | 0xe3, 0xbf, 0xf8, 0x55, 0x42, 0xe2, 0x7f, 0x59, 0xe5, 0x17, 0xef, 0x99, 0x34, 0x69, 0x91, | ||
| 117 | 0xb1, 0x23, 0x8e, 0x20, 0x87, 0x2d, 0xa8, 0xfe, 0xd5, 0x8a, 0xf3, 0x84, 0x3a, 0xf0, 0x37, | ||
| 118 | 0xe4, 0x09, 0x00, 0x54, 0xee, 0x67, 0x49, 0x93, 0xe4, 0x81, 0x70, 0xe3, 0x90, 0x4d, 0xef, | ||
| 119 | 0xfe, 0x41, 0xb7, 0x99, 0x7b, 0xc1, 0x83, 0xba, 0x62, 0x12, 0x6f, 0x7d, 0xde, 0x6b, 0xaf, | ||
| 120 | 0xda, 0x16, 0xf9, 0x55, 0x51, 0xee, 0xa6, 0x0c, 0x2b, 0x02, 0xa3, 0xfd, 0x8d, 0xfb, 0x30, | ||
| 121 | 0x17, 0xe4, 0x6f, 0xdf, 0x36, 0x71, 0xc4, 0xca, 0x87, 0x25, 0x48, 0xb0, 0x47, 0xec, 0xea, | ||
| 122 | 0xb4, 0xbf, 0xa5, 0x4d, 0x9b, 0x9f, 0x02, 0x93, 0xc4, 0xe3, 0xe4, 0xe8, 0x42, 0x2d, 0x68, | ||
| 123 | 0x81, 0x15, 0x0a, 0xeb, 0x84, 0x5b, 0xd6, 0xa8, 0x74, 0xfb, 0x7d, 0x1d, 0xcb, 0x2c, 0xda, | ||
| 124 | 0x46, 0x2a, 0x76, 0x62, 0xce, 0xbc, 0x5c, 0x9e, 0x8b, 0xe7, 0xcf, 0xbe, 0x78, 0xf5, 0x7c, | ||
| 125 | 0xeb, 0xb3, 0x3a, 0x9c, 0xaa, 0x6f, 0xcc, 0x72, 0xd1, 0x59, 0xf2, 0x11, 0x23, 0xd6, 0x3f, | ||
| 126 | 0x48, 0xd1, 0xb7, 0xce, 0xb0, 0xbf, 0xcb, 0xea, 0x80, 0xde, 0x57, 0xd4, 0x5e, 0x97, 0x2f, | ||
| 127 | 0x75, 0xd1, 0x50, 0x8e, 0x80, 0x2c, 0x66, 0x79, 0xbf, 0x72, 0x4b, 0xbd, 0x8a, 0x81, 0x6c, | ||
| 128 | 0xd3, 0xe1, 0x01, 0xdc, 0xd2, 0x15, 0x26, 0xc5, 0x36, 0xda, 0x2c, 0x1a, 0xc0, 0x27, 0x94, | ||
| 129 | 0xed, 0xb7, 0x9b, 0x85, 0x0b, 0x5e, 0x80, 0x97, 0xc5, 0xec, 0x4f, 0xec, 0x88, 0x5d, 0x50, | ||
| 130 | 0x07, 0x35, 0x47, 0xdc, 0x0b, 0x3b, 0x3d, 0xdd, 0x60, 0xaf, 0xa8, 0x5d, 0x81, 0x38, 0x24, | ||
| 131 | 0x25, 0x5d, 0x5c, 0x15, 0xd1, 0xde, 0xb3, 0xab, 0xec, 0x05, 0x69, 0xef, 0x83, 0xed, 0x57, | ||
| 132 | 0x54, 0xb8, 0x64, 0x64, 0x11, 0x16, 0x32, 0x69, 0xda, 0x9f, 0x2d, 0x7f, 0x36, 0xbb, 0x44, | ||
| 133 | 0x5a, 0x34, 0xe8, 0x7f, 0xbf, 0x03, 0xeb, 0x00, 0x7f, 0x59, 0x68, 0x22, 0x79, 0xcf, 0x73, | ||
| 134 | 0x6c, 0x2c, 0x29, 0xa7, 0xa1, 0x5f, 0x38, 0xa1, 0x1d, 0xf0, 0x20, 0x53, 0xe0, 0x1a, 0x63, | ||
| 135 | 0x14, 0x58, 0x71, 0x10, 0xaa, 0x08, 0x0c, 0x3e, 0x16, 0x1a, 0x60, 0x22, 0x82, 0x7f, 0xba, | ||
| 136 | 0xa4, 0x43, 0xa0, 0xd0, 0xac, 0x1b, 0xd5, 0x6b, 0x64, 0xb5, 0x14, 0x93, 0x31, 0x9e, 0x53, | ||
| 137 | 0x50, 0xd0, 0x57, 0x66, 0xee, 0x5a, 0x4f, 0xfb, 0x03, 0x2a, 0x69, 0x58, 0x76, 0xf1, 0x83, | ||
| 138 | 0xf7, 0x4e, 0xba, 0x8c, 0x42, 0x06, 0x60, 0x5d, 0x6d, 0xce, 0x60, 0x88, 0xae, 0xa4, 0xc3, | ||
| 139 | 0xf1, 0x03, 0xa5, 0x4b, 0x98, 0xa1, 0xff, 0x67, 0xe1, 0xac, 0xa2, 0xb8, 0x62, 0xd7, 0x6f, | ||
| 140 | 0xa0, 0x31, 0xb4, 0xd2, 0x77, 0xaf, 0x21, 0x10, 0x06, 0xc6, 0x9a, 0xff, 0x1d, 0x09, 0x17, | ||
| 141 | 0x0e, 0x5f, 0xf1, 0xaa, 0x54, 0x34, 0x4b, 0x45, 0x8a, 0x87, 0x63, 0xa6, 0xdc, 0xf9, 0x24, | ||
| 142 | 0x30, 0x67, 0xc6, 0xb2, 0xd6, 0x61, 0x33, 0x69, 0xee, 0x50, 0x61, 0x57, 0x28, 0xe7, 0x7e, | ||
| 143 | 0xee, 0xec, 0x3a, 0x5a, 0x73, 0x4e, 0xa8, 0x8d, 0xe4, 0x18, 0xea, 0xec, 0x41, 0x64, 0xc8, | ||
| 144 | 0xe2, 0xe8, 0x66, 0xb6, 0x2d, 0xb6, 0xfb, 0x6a, 0x6c, 0x16, 0xb3, 0xdd, 0x46, 0x43, 0xb9, | ||
| 145 | 0x73, 0x00, 0x6a, 0x71, 0xed, 0x4e, 0x9d, 0x25, 0x1a, 0xc3, 0x3c, 0x4a, 0x95, 0x15, 0x99, | ||
| 146 | 0x35, 0x81, 0x14, 0x02, 0xd6, 0x98, 0x9b, 0xec, 0xd8, 0x23, 0x3b, 0x84, 0x29, 0xaf, 0x0c, | ||
| 147 | 0x99, 0x83, 0xa6, 0x9a, 0x34, 0x4f, 0xfa, 0xe8, 0xd0, 0x3c, 0x4b, 0xd0, 0xfb, 0xb6, 0x68, | ||
| 148 | 0xb8, 0x9e, 0x8f, 0xcd, 0xf7, 0x60, 0x2d, 0x7a, 0x22, 0xe5, 0x7d, 0xab, 0x65, 0x1b, 0x95, | ||
| 149 | 0xa7, 0xa8, 0x7f, 0xb6, 0x77, 0x47, 0x7b, 0x5f, 0x8b, 0x12, 0x72, 0xd0, 0xd4, 0x91, 0xef, | ||
| 150 | 0xde, 0x19, 0x50, 0x3c, 0xa7, 0x8b, 0xc4, 0xa9, 0xb3, 0x23, 0xcb, 0x76, 0xe6, 0x81, 0xf0, | ||
| 151 | 0xc1, 0x04, 0x8f, 0xa3, 0xb8, 0x54, 0x5b, 0x97, 0xac, 0x19, 0xff, 0x3f, 0x55, 0x27, 0x2f, | ||
| 152 | 0xe0, 0x1d, 0x42, 0x9b, 0x57, 0xfc, 0x4b, 0x4e, 0x0f, 0xce, 0x98, 0xa9, 0x43, 0x57, 0x03, | ||
| 153 | 0xbd, 0xe7, 0xc8, 0x94, 0xdf, 0x6e, 0x36, 0x73, 0x32, 0xb4, 0xef, 0x2e, 0x85, 0x7a, 0x6e, | ||
| 154 | 0xfc, 0x6c, 0x18, 0x82, 0x75, 0x35, 0x90, 0x07, 0xf3, 0xe4, 0x9f, 0x3e, 0xdc, 0x68, 0xf3, | ||
| 155 | 0xb5, 0xf3, 0x19, 0x80, 0x92, 0x06, 0x99, 0xa2, 0xe8, 0x6f, 0xff, 0x2e, 0x7f, 0xae, 0x42, | ||
| 156 | 0xa4, 0x5f, 0xfb, 0xd4, 0x0e, 0x81, 0x2b, 0xc3, 0x04, 0xff, 0x2b, 0xb3, 0x74, 0x4e, 0x36, | ||
| 157 | 0x5b, 0x9c, 0x15, 0x00, 0xc6, 0x47, 0x2b, 0xe8, 0x8b, 0x3d, 0xf1, 0x9c, 0x03, 0x9a, 0x58, | ||
| 158 | 0x7f, 0x9b, 0x9c, 0xbf, 0x85, 0x49, 0x79, 0x35, 0x2e, 0x56, 0x7b, 0x41, 0x14, 0x39, 0x47, | ||
| 159 | 0x83, 0x26, 0xaa, 0x07, 0x89, 0x98, 0x11, 0x1b, 0x86, 0xe7, 0x73, 0x7a, 0xd8, 0x7d, 0x78, | ||
| 160 | 0x61, 0x53, 0xe9, 0x79, 0xf5, 0x36, 0x8d, 0x44, 0x92, 0x84, 0xf9, 0x13, 0x50, 0x58, 0x3b, | ||
| 161 | 0xa4, 0x6a, 0x36, 0x65, 0x49, 0x8e, 0x3c, 0x0e, 0xf1, 0x6f, 0xd2, 0x84, 0xc4, 0x7e, 0x8e, | ||
| 162 | 0x3f, 0x39, 0xae, 0x7c, 0x84, 0xf1, 0x63, 0x37, 0x8e, 0x3c, 0xcc, 0x3e, 0x44, 0x81, 0x45, | ||
| 163 | 0xf1, 0x4b, 0xb9, 0xed, 0x6b, 0x36, 0x5d, 0xbb, 0x20, 0x60, 0x1a, 0x0f, 0xa3, 0xaa, 0x55, | ||
| 164 | 0x77, 0x3a, 0xa9, 0xae, 0x37, 0x4d, 0xba, 0xb8, 0x86, 0x6b, 0xbc, 0x08, 0x50, 0xf6, 0xcc, | ||
| 165 | 0xa4, 0xbd, 0x1d, 0x40, 0x72, 0xa5, 0x86, 0xfa, 0xe2, 0x10, 0xae, 0x3d, 0x58, 0x4b, 0x97, | ||
| 166 | 0xf3, 0x43, 0x74, 0xa9, 0x9e, 0xeb, 0x21, 0xb7, 0x01, 0xa4, 0x86, 0x93, 0x97, 0xee, 0x2f, | ||
| 167 | 0x4f, 0x3b, 0x86, 0xa1, 0x41, 0x6f, 0x41, 0x26, 0x90, 0x78, 0x5c, 0x7f, 0x30, 0x38, 0x4b, | ||
| 168 | 0x3f, 0xaa, 0xec, 0xed, 0x5c, 0x6f, 0x0e, 0xad, 0x43, 0x87, 0xfd, 0x93, 0x35, 0xe6, 0x01, | ||
| 169 | 0xef, 0x41, 0x26, 0x90, 0x99, 0x9e, 0xfb, 0x19, 0x5b, 0xad, 0xd2, 0x91, 0x8a, 0xe0, 0x46, | ||
| 170 | 0xaf, 0x65, 0xfa, 0x4f, 0x84, 0xc1, 0xa1, 0x2d, 0xcf, 0x45, 0x8b, 0xd3, 0x85, 0x50, 0x55, | ||
| 171 | 0x7c, 0xf9, 0x67, 0x88, 0xd4, 0x4e, 0xe9, 0xd7, 0x6b, 0x61, 0x54, 0xa1, 0xa4, 0xa6, 0xa2, | ||
| 172 | 0xc2, 0xbf, 0x30, 0x9c, 0x40, 0x9f, 0x5f, 0xd7, 0x69, 0x2b, 0x24, 0x82, 0x5e, 0xd9, 0xd6, | ||
| 173 | 0xa7, 0x12, 0x54, 0x1a, 0xf7, 0x55, 0x9f, 0x76, 0x50, 0xa9, 0x95, 0x84, 0xe6, 0x6b, 0x6d, | ||
| 174 | 0xb5, 0x96, 0x54, 0xd6, 0xcd, 0xb3, 0xa1, 0x9b, 0x46, 0xa7, 0x94, 0x4d, 0xc4, 0x94, 0xb4, | ||
| 175 | 0x98, 0xe3, 0xe1, 0xe2, 0x34, 0xd5, 0x33, 0x16, 0x07, 0x54, 0xcd, 0xb7, 0x77, 0x53, 0xdb, | ||
| 176 | 0x4f, 0x4d, 0x46, 0x9d, 0xe9, 0xd4, 0x9c, 0x8a, 0x36, 0xb6, 0xb8, 0x38, 0x26, 0x6c, 0x0e, | ||
| 177 | 0xff, 0x9c, 0x1b, 0x43, 0x8b, 0x80, 0xcc, 0xb9, 0x3d, 0xda, 0xc7, 0xf1, 0x8a, 0xf2, 0x6d, | ||
| 178 | 0xb8, 0xd7, 0x74, 0x2f, 0x7e, 0x1e, 0xb7, 0xd3, 0x4a, 0xb4, 0xac, 0xfc, 0x79, 0x48, 0x6c, | ||
| 179 | 0xbc, 0x96, 0xb6, 0x94, 0x46, 0x57, 0x2d, 0xb0, 0xa3, 0xfc, 0x1e, 0xb9, 0x52, 0x60, 0x85, | ||
| 180 | 0x2d, 0x41, 0xd0, 0x43, 0x01, 0x1e, 0x1c, 0xd5, 0x7d, 0xfc, 0xf3, 0x96, 0x0d, 0xc7, 0xcb, | ||
| 181 | 0x2a, 0x29, 0x9a, 0x93, 0xdd, 0x88, 0x2d, 0x37, 0x5d, 0xaa, 0xfb, 0x49, 0x68, 0xa0, 0x9c, | ||
| 182 | 0x50, 0x86, 0x7f, 0x68, 0x56, 0x57, 0xf9, 0x79, 0x18, 0x39, 0xd4, 0xe0, 0x01, 0x84, 0x33, | ||
| 183 | 0x61, 0xca, 0xa5, 0xd2, 0xd6, 0xe4, 0xc9, 0x8a, 0x4a, 0x23, 0x44, 0x4e, 0xbc, 0xf0, 0xdc, | ||
| 184 | 0x24, 0xa1, 0xa0, 0xc4, 0xe2, 0x07, 0x3c, 0x10, 0xc4, 0xb5, 0x25, 0x4b, 0x65, 0x63, 0xf4, | ||
| 185 | 0x80, 0xe7, 0xcf, 0x61, 0xb1, 0x71, 0x82, 0x21, 0x87, 0x2c, 0xf5, 0x91, 0x00, 0x32, 0x0c, | ||
| 186 | 0xec, 0xa9, 0xb5, 0x9a, 0x74, 0x85, 0xe3, 0x36, 0x8f, 0x76, 0x4f, 0x9c, 0x6d, 0xce, 0xbc, | ||
| 187 | 0xad, 0x0a, 0x4b, 0xed, 0x76, 0x04, 0xcb, 0xc3, 0xb9, 0x33, 0x9e, 0x01, 0x93, 0x96, 0x69, | ||
| 188 | 0x7d, 0xc5, 0xa2, 0x45, 0x79, 0x9b, 0x04, 0x5c, 0x84, 0x09, 0xed, 0x88, 0x43, 0xc7, 0xab, | ||
| 189 | 0x93, 0x14, 0x26, 0xa1, 0x40, 0xb5, 0xce, 0x4e, 0xbf, 0x2a, 0x42, 0x85, 0x3e, 0x2c, 0x3b, | ||
| 190 | 0x54, 0xe8, 0x12, 0x1f, 0x0e, 0x97, 0x59, 0xb2, 0x27, 0x89, 0xfa, 0xf2, 0xdf, 0x8e, 0x68, | ||
| 191 | 0x59, 0xdc, 0x06, 0xbc, 0xb6, 0x85, 0x0d, 0x06, 0x22, 0xec, 0xb1, 0xcb, 0xe5, 0x04, 0xe6, | ||
| 192 | 0x3d, 0xb3, 0xb0, 0x41, 0x73, 0x08, 0x3f, 0x3c, 0x58, 0x86, 0x63, 0xeb, 0x50, 0xee, 0x1d, | ||
| 193 | 0x2c, 0x37, 0x74, 0xa9, 0xd3, 0x18, 0xa3, 0x47, 0x6e, 0x93, 0x54, 0xad, 0x0a, 0x5d, 0xb8, | ||
| 194 | 0x2a, 0x55, 0x5d, 0x78, 0xf6, 0xee, 0xbe, 0x8e, 0x3c, 0x76, 0x69, 0xb9, 0x40, 0xc2, 0x34, | ||
| 195 | 0xec, 0x2a, 0xb9, 0xed, 0x7e, 0x20, 0xe4, 0x8d, 0x00, 0x38, 0xc7, 0xe6, 0x8f, 0x44, 0xa8, | ||
| 196 | 0x86, 0xce, 0xeb, 0x2a, 0xe9, 0x90, 0xf1, 0x4c, 0xdf, 0x32, 0xfb, 0x73, 0x1b, 0x6d, 0x92, | ||
| 197 | 0x1e, 0x95, 0xfe, 0xb4, 0xdb, 0x65, 0xdf, 0x4d, 0x23, 0x54, 0x89, 0x48, 0xbf, 0x4a, 0x2e, | ||
| 198 | 0x70, 0xd6, 0xd7, 0x62, 0xb4, 0x33, 0x29, 0xb1, 0x3a, 0x33, 0x4c, 0x23, 0x6d, 0xa6, 0x76, | ||
| 199 | 0xa5, 0x21, 0x63, 0x48, 0xe6, 0x90, 0x5d, 0xed, 0x90, 0x95, 0x0b, 0x7a, 0x84, 0xbe, 0xb8, | ||
| 200 | 0x0d, 0x5e, 0x63, 0x0c, 0x62, 0x26, 0x4c, 0x14, 0x5a, 0xb3, 0xac, 0x23, 0xa4, 0x74, 0xa7, | ||
| 201 | 0x6f, 0x33, 0x30, 0x05, 0x60, 0x01, 0x42, 0xa0, 0x28, 0xb7, 0xee, 0x19, 0x38, 0xf1, 0x64, | ||
| 202 | 0x80, 0x82, 0x43, 0xe1, 0x41, 0x27, 0x1f, 0x1f, 0x90, 0x54, 0x7a, 0xd5, 0x23, 0x2e, 0xd1, | ||
| 203 | 0x3d, 0xcb, 0x28, 0xba, 0x58, 0x7f, 0xdc, 0x7c, 0x91, 0x24, 0xe9, 0x28, 0x51, 0x83, 0x6e, | ||
| 204 | 0xc5, 0x56, 0x21, 0x42, 0xed, 0xa0, 0x56, 0x22, 0xa1, 0x40, 0x80, 0x6b, 0xa8, 0xf7, 0x94, | ||
| 205 | 0xca, 0x13, 0x6b, 0x0c, 0x39, 0xd9, 0xfd, 0xe9, 0xf3, 0x6f, 0xa6, 0x9e, 0xfc, 0x70, 0x8a, | ||
| 206 | 0xb3, 0xbc, 0x59, 0x3c, 0x1e, 0x1d, 0x6c, 0xf9, 0x7c, 0xaf, 0xf9, 0x88, 0x71, 0x95, 0xeb, | ||
| 207 | 0x57, 0x00, 0xbd, 0x9f, 0x8c, 0x4f, 0xe1, 0x24, 0x83, 0xc5, 0x22, 0xea, 0xfd, 0xd3, 0x0c, | ||
| 208 | 0xe2, 0x17, 0x18, 0x7c, 0x6a, 0x4c, 0xde, 0x77, 0xb4, 0x53, 0x9b, 0x4c, 0x81, 0xcd, 0x23, | ||
| 209 | 0x60, 0xaa, 0x0e, 0x25, 0x73, 0x9c, 0x02, 0x79, 0x32, 0x30, 0xdf, 0x74, 0xdf, 0x75, 0x19, | ||
| 210 | 0xf4, 0xa5, 0x14, 0x5c, 0xf7, 0x7a, 0xa8, 0xa5, 0x91, 0x84, 0x7c, 0x60, 0x03, 0x06, 0x3b, | ||
| 211 | 0xcd, 0x50, 0xb6, 0x27, 0x9c, 0xfe, 0xb1, 0xdd, 0xcc, 0xd3, 0xb0, 0x59, 0x24, 0xb2, 0xca, | ||
| 212 | 0xe2, 0x1c, 0x81, 0x22, 0x9d, 0x07, 0x8f, 0x8e, 0xb9, 0xbe, 0x4e, 0xfa, 0xfc, 0x39, 0x65, | ||
| 213 | 0xba, 0xbf, 0x9d, 0x12, 0x37, 0x5e, 0x97, 0x7e, 0xf3, 0x89, 0xf5, 0x5d, 0xf5, 0xe3, 0x09, | ||
| 214 | 0x8c, 0x62, 0xb5, 0x20, 0x9d, 0x0c, 0x53, 0x8a, 0x68, 0x1b, 0xd2, 0x8f, 0x75, 0x17, 0x5d, | ||
| 215 | 0xd4, 0xe5, 0xda, 0x75, 0x62, 0x19, 0x14, 0x6a, 0x26, 0x2d, 0xeb, 0xf8, 0xaf, 0x37, 0xf0, | ||
| 216 | 0x6c, 0xa4, 0x55, 0xb1, 0xbc, 0xe2, 0x33, 0xc0, 0x9a, 0xca, 0xb0, 0x11, 0x49, 0x4f, 0x68, | ||
| 217 | 0x9b, 0x3b, 0x6b, 0x3c, 0xcc, 0x13, 0xf6, 0xc7, 0x85, 0x61, 0x68, 0x42, 0xae, 0xbb, 0xdd, | ||
| 218 | 0xcd, 0x45, 0x16, 0x29, 0x1d, 0xea, 0xdb, 0xc8, 0x03, 0x94, 0x3c, 0xee, 0x4f, 0x82, 0x11, | ||
| 219 | 0xc3, 0xec, 0x28, 0xbd, 0x97, 0x05, 0x99, 0xde, 0xd7, 0xbb, 0x5e, 0x22, 0x1f, 0xd4, 0xeb, | ||
| 220 | 0x64, 0xd9, 0x92, 0xd9, 0x85, 0xb7, 0x6a, 0x05, 0x6a, 0xe4, 0x24, 0x41, 0xf1, 0xcd, 0xf0, | ||
| 221 | 0xd8, 0x3f, 0xf8, 0x9e, 0x0e, 0xcd, 0x0b, 0x7a, 0x70, 0x6b, 0x5a, 0x75, 0x0a, 0x6a, 0x33, | ||
| 222 | 0x88, 0xec, 0x17, 0x75, 0x08, 0x70, 0x10, 0x2f, 0x24, 0xcf, 0xc4, 0xe9, 0x42, 0x00, 0x61, | ||
| 223 | 0x94, 0xca, 0x1f, 0x3a, 0x76, 0x06, 0xfa, 0xd2, 0x48, 0x81, 0xf0, 0x77, 0x60, 0x03, 0x45, | ||
| 224 | 0xd9, 0x61, 0xf4, 0xa4, 0x6f, 0x3d, 0xd9, 0x30, 0xc3, 0x04, 0x6b, 0x54, 0x2a, 0xb7, 0xec, | ||
| 225 | 0x3b, 0xf4, 0x4b, 0xf5, 0x68, 0x52, 0x26, 0xce, 0xff, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xa5, | ||
| 226 | 0xa9, 0xb1, 0xe0, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0xf9, 0x51, 0x20, 0xa3, 0xa5, 0xa9, 0xb1, | ||
| 227 | 0xc1, 0x00, 0x82, 0x86, 0x8e, 0x7f, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xc4, 0xeb, 0x54, 0x0b, | ||
| 228 | 0x75, 0x68, 0x52, 0x07, 0x8c, 0x9a, 0x97, 0x8d, 0x79, 0x70, 0x62, 0x46, 0xef, 0x5c, 0x1b, | ||
| 229 | 0x95, 0x89, 0x71, 0x41, 0xe1, 0x21, 0xa1, 0xa1, 0xa1, 0xc0, 0x02, 0x67, 0x4c, 0x1a, 0xb6, | ||
| 230 | 0xcf, 0xfd, 0x78, 0x53, 0x24, 0xab, 0xb5, 0xc9, 0xf1, 0x60, 0x23, 0xa5, 0xc8, 0x12, 0x87, | ||
| 231 | 0x6d, 0x58, 0x13, 0x85, 0x88, 0x92, 0x87, 0x6d, 0x58, 0x32, 0xc7, 0x0c, 0x9a, 0x97, 0xac, | ||
| 232 | 0xda, 0x36, 0xee, 0x5e, 0x3e, 0xdf, 0x1d, 0xb8, 0xf2, 0x66, 0x2f, 0xbd, 0xf8, 0x72, 0x47, | ||
| 233 | 0xed, 0x58, 0x13, 0x85, 0x88, 0x92, 0x87, 0x8c, 0x7b, 0x55, 0x09, 0x90, 0xa2, 0xc6, 0xef, | ||
| 234 | 0x3d, 0xf8, 0x53, 0x24, 0xab, 0xd4, 0x2a, 0xb7, 0xec, 0x5a, 0x36, 0xee, 0x5e, 0x3e, 0xdf, | ||
| 235 | 0x3c, 0xfa, 0x76, 0x4f, 0xfd, 0x59, 0x30, 0xe2, 0x46, 0xef, 0x3d, 0xf8, 0x53, 0x05, 0x69, | ||
| 236 | 0x31, 0xc1, 0x00, 0x82, 0x86, 0x8e, 0x7f, 0x5d, 0x19, 0xb0, 0xe2, 0x27, 0xcc, 0xfb, 0x74, | ||
| 237 | 0x4b, 0x14, 0x8b, 0x94, 0x8b, 0x75, 0x68, 0x33, 0xc5, 0x08, 0x92, 0x87, 0x8c, 0x9a, 0xb6, | ||
| 238 | 0xcf, 0x1c, 0xba, 0xd7, 0x0d, 0x98, 0xb2, 0xe6, 0x2f, 0xdc, 0x1b, 0x95, 0x89, 0x71, 0x60, | ||
| 239 | 0x23, 0xc4, 0x0a, 0x96, 0x8f, 0x9c, 0xba, 0xf6, 0x6e, 0x3f, 0xfc, 0x5b, 0x15, 0xa8, 0xd2, | ||
| 240 | 0x26, 0xaf, 0xbd, 0xf8, 0x72, 0x66, 0x2f, 0xdc, 0x1b, 0xb4, 0xcb, 0x14, 0x8b, 0x94, 0xaa, | ||
| 241 | 0xb7, 0xcd, 0xf9, 0x51, 0x01, 0x80, 0x82, 0x86, 0x6f, 0x3d, 0xd9, 0x30, 0xe2, 0x27, 0xcc, | ||
| 242 | 0xfb, 0x74, 0x4b, 0x14, 0xaa, 0xb7, 0xcd, 0xf9, 0x70, 0x43, 0x04, 0x6b, 0x35, 0xc9, 0xf1, | ||
| 243 | 0x60, 0x23, 0xa5, 0xc8, 0xf3, 0x45, 0x08, 0x92, 0x87, 0x6d, 0x58, 0x32, 0xe6, 0x2f, 0xbd, | ||
| 244 | 0xf8, 0x72, 0x66, 0x4e, 0x1e, 0xbe, 0xfe, 0x7e, 0x7e, 0x7e, 0x5f, 0x1d, 0x99, 0x91, 0xa0, | ||
| 245 | 0xa3, 0xc4, 0x0a, 0x77, 0x4d, 0x18, 0x93, 0xa4, 0xab, 0xd4, 0x0b, 0x75, 0x49, 0x10, 0xa2, | ||
| 246 | 0xc6, 0xef, 0x3d, 0xf8, 0x53, 0x24, 0xab, 0xb5, 0xe8, 0x33, 0xe4, 0x4a, 0x16, 0xae, 0xde, | ||
| 247 | 0x1f, 0xbc, 0xdb, 0x15, 0xa8, 0xb3, 0xc5, 0x08, 0x73, 0x45, 0xe9, 0x31, 0xc1, 0xe1, 0x21, | ||
| 248 | 0xa1, 0xa1, 0xa1, 0xc0, 0x02, 0x86, 0x6f, 0x5c, 0x3a, 0xd7, 0x0d, 0x98, 0x93, 0xa4, 0xca, | ||
| 249 | 0x16, 0xae, 0xde, 0x1f, 0x9d, 0x99, 0xb0, 0xe2, 0x46, 0xef, 0x3d, 0xf8, 0x72, 0x47, 0x0c, | ||
| 250 | 0x9a, 0xb6, 0xcf, 0xfd, 0x59, 0x11, 0xa0, 0xa3, 0xa5, 0xc8, 0xf3, 0x45, 0x08, 0x92, 0x87, | ||
| 251 | 0x6d, 0x39, 0xf0, 0x43, 0x04, 0x8a, 0x96, 0xae, 0xde, 0x3e, 0xdf, 0x1d, 0x99, 0x91, 0xa0, | ||
| 252 | 0xc2, 0x06, 0x6f, 0x3d, 0xf8, 0x72, 0x47, 0x0c, 0x9a, 0x97, 0x8d, 0x98, 0x93, 0x85, 0x88, | ||
| 253 | 0x73, 0x45, 0xe9, 0x31, 0xe0, 0x23, 0xa5, 0xa9, 0xd0, 0x03, 0x84, 0x8a, 0x96, 0xae, 0xde, | ||
| 254 | 0x1f, 0xbc, 0xdb, 0x15, 0xa8, 0xd2, 0x26, 0xce, 0xff, 0x5d, 0x19, 0x91, 0x81, 0x80, 0x82, | ||
| 255 | 0x67, 0x2d, 0xd8, 0x13, 0xa4, 0xab, 0xd4, 0x0b, 0x94, 0xaa, 0xb7, 0xcd, 0xf9, 0x51, 0x20, | ||
| 256 | 0xa3, 0xa5, 0xc8, 0xf3, 0x45, 0xe9, 0x50, 0x22, 0xc6, 0xef, 0x5c, 0x3a, 0xd7, 0x0d, 0x98, | ||
| 257 | 0x93, 0x85, 0x88, 0x73, 0x64, 0x4a, 0xf7, 0x4d, 0xf9, 0x51, 0x20, 0xa3, 0xc4, 0x0a, 0x96, | ||
| 258 | 0xae, 0xde, 0x3e, 0xfe, 0x7e, 0x7e, 0x7e, 0x5f, 0x3c, 0xfa, 0x76, 0x4f, 0xfd, 0x78, 0x72, | ||
| 259 | 0x66, 0x2f, 0xbd, 0xd9, 0x30, 0xc3, 0xe5, 0x48, 0x12, 0x87, 0x8c, 0x7b, 0x55, 0x28, 0xd2, | ||
| 260 | 0x07, 0x8c, 0x9a, 0x97, 0xac, 0xda, 0x17, 0x8d, 0x79, 0x51, 0x20, 0xa3, 0xc4, 0xeb, 0x54, | ||
| 261 | 0x0b, 0x94, 0x8b, 0x94, 0xaa, 0xd6, 0x2e, 0xbf, 0xfc, 0x5b, 0x15, 0xa8, 0xd2, 0x26, 0xaf, | ||
| 262 | 0xdc, 0x1b, 0xb4, 0xea, 0x37, 0xec, 0x3b, 0xf4, 0x6a, 0x37, 0xcd, 0x18, 0x93, 0x85, 0x69, | ||
| 263 | 0x31, 0xc1, 0xe1, 0x40, 0xe3, 0x25, 0xc8, 0x12, 0x87, 0x8c, 0x9a, 0xb6, 0xcf, 0xfd, 0x59, | ||
| 264 | 0x11, 0xa0, 0xc2, 0x06, 0x8e, 0x7f, 0x5d, 0x38, 0xf2, 0x47, 0x0c, 0x7b, 0x74, 0x6a, 0x37, | ||
| 265 | 0xec, 0x5a, 0x36, 0xee, 0x3f, 0xfc, 0x7a, 0x76, 0x4f, 0x1c, 0x9b, 0x95, 0x89, 0x71, 0x41, | ||
| 266 | 0x00, 0x63, 0x44, 0xeb, 0x54, 0x2a, 0xd6, 0x0f, 0x9c, 0xba, 0xd7, 0x0d, 0x98, 0x93, 0x85, | ||
| 267 | 0x69, 0x31, 0xc1, 0x00, 0x82, 0x86, 0x8e, 0x9e, 0xbe, 0xdf, 0x3c, 0xfa, 0x57, 0x2c, 0xda, | ||
| 268 | 0x36, 0xee, 0x3f, 0xfc, 0x5b, 0x15, 0x89, 0x71, 0x41, 0x00, 0x82, 0x86, 0x8e, 0x7f, 0x5d, | ||
| 269 | 0x38, 0xf2, 0x47, 0xed, 0x58, 0x13, 0xa4, 0xca, 0xf7, 0x4d, 0xf9, 0x51, 0x01, 0x80, 0x63, | ||
| 270 | 0x44, 0xeb, 0x54, 0x2a, 0xd6, 0x2e, 0xbf, 0xdd, 0x19, 0x91, 0xa0, 0xa3, 0xa5, 0xa9, 0xb1, | ||
| 271 | 0xe0, 0x42, 0x06, 0x8e, 0x7f, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xc4, 0x0a, 0x96, 0x8f, 0x7d, | ||
| 272 | 0x78, 0x72, 0x47, 0x0c, 0x7b, 0x74, 0x6a, 0x56, 0x2e, 0xde, 0x1f, 0xbc, 0xfa, 0x57, 0x0d, | ||
| 273 | 0x79, 0x51, 0x01, 0x61, 0x21, 0xa1, 0xc0, 0xe3, 0x25, 0xa9, 0xb1, 0xc1, 0xe1, 0x40, 0x02, | ||
| 274 | 0x67, 0x4c, 0x1a, 0x97, 0x8d, 0x98, 0x93, 0xa4, 0xab, 0xd4, 0x2a, 0xd6, 0x0f, 0x9c, 0x9b, | ||
| 275 | 0xb4, 0xcb, 0x14, 0xaa, 0xb7, 0xcd, 0xf9, 0x51, 0x20, 0xa3, 0xc4, 0xeb, 0x35, 0xc9, 0xf1, | ||
| 276 | 0x60, 0x42, 0x06, 0x8e, 0x7f, 0x7c, 0x7a, 0x76, 0x6e, 0x3f, 0xfc, 0x7a, 0x76, 0x6e, 0x5e, | ||
| 277 | 0x3e, 0xfe, 0x7e, 0x5f, 0x3c, 0xdb, 0x15, 0x89, 0x71, 0x41, 0xe1, 0x21, 0xc0, 0xe3, 0x44, | ||
| 278 | 0xeb, 0x54, 0x2a, 0xb7, 0xcd, 0xf9, 0x70, 0x62, 0x27, 0xad, 0xd8, 0x32, 0xc7, 0x0c, 0x7b, | ||
| 279 | 0x74, 0x4b, 0x14, 0xaa, 0xb7, 0xec, 0x3b, 0xd5, 0x28, 0xd2, 0x07, 0x6d, 0x39, 0xd1, 0x20, | ||
| 280 | 0xc2, 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 | |||
| 21 | POINTING_DEVICE_ENABLE = yes | 21 | POINTING_DEVICE_ENABLE = yes |
| 22 | 22 | ||
| 23 | DEFAULT_FOLDER = oddball/v1 | 23 | DEFAULT_FOLDER = oddball/v1 |
| 24 | |||
| 25 | SRC += spi_master.c | ||
| 26 | SRC += drivers/sensors/adns9800.c | ||
| 27 | SRC += 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 | ||
| 49 | keyboard_config_t keyboard_config; | 50 | keyboard_config_t keyboard_config; |
| @@ -65,13 +66,7 @@ uint8_t OptLowPin = OPT_ENC1; | |||
| 65 | bool debug_encoder = false; | 66 | bool debug_encoder = false; |
| 66 | bool is_drag_scroll = false; | 67 | bool is_drag_scroll = false; |
| 67 | 68 | ||
| 68 | __attribute__((weak)) void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v) { | 69 | void 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 | ||
| 154 | bool process_record_kb(uint16_t keycode, keyrecord_t* record) { | 118 | bool 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 | ||
| 243 | void pointing_device_init(void) { | 203 | void 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 | |||
| 251 | void 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 | |||
| 272 | void eeconfig_init_kb(void) { | 209 | void 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 | |||
| 288 | void 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 | ||
| 34 | void process_mouse(report_mouse_t* mouse_report); | ||
| 35 | void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y); | ||
| 36 | void process_wheel(report_mouse_t* mouse_report); | 31 | void process_wheel(report_mouse_t* mouse_report); |
| 37 | void 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 | |||
| 22 | RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow | 22 | RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow |
| 23 | AUDIO_ENABLE = no # Audio output | 23 | AUDIO_ENABLE = no # Audio output |
| 24 | POINTING_DEVICE_ENABLE = yes | 24 | POINTING_DEVICE_ENABLE = yes |
| 25 | POINTING_DEVICE_DRIVER = pmw3360 | ||
| 25 | MOUSEKEY_ENABLE = yes # Mouse keys | 26 | MOUSEKEY_ENABLE = yes # Mouse keys |
| 26 | 27 | ||
| 27 | QUANTUM_LIB_SRC += analog.c spi_master.c | 28 | QUANTUM_LIB_SRC += analog.c |
| 28 | SRC += drivers/sensors/pmw3360.c opt_encoder.c | 29 | SRC += 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 | |||
| 19 | RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow | 19 | RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow |
| 20 | AUDIO_ENABLE = no # Audio output | 20 | AUDIO_ENABLE = no # Audio output |
| 21 | POINTING_DEVICE_ENABLE = yes | 21 | POINTING_DEVICE_ENABLE = yes |
| 22 | POINTING_DEVICE_DRIVER = pmw3360 | ||
| 22 | MOUSEKEY_ENABLE = yes # Mouse keys | 23 | MOUSEKEY_ENABLE = yes # Mouse keys |
| 23 | 24 | ||
| 24 | QUANTUM_LIB_SRC += analog.c spi_master.c | 25 | QUANTUM_LIB_SRC += analog.c |
| 25 | SRC += drivers/sensors/pmw3360.c opt_encoder.c | 26 | SRC += opt_encoder.c |
| 26 | 27 | ||
| 27 | DEFAULT_FOLDER = ploopyco/trackball/rev1_005 | 28 | DEFAULT_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; | |||
| 65 | bool debug_encoder = false; | 65 | bool debug_encoder = false; |
| 66 | bool is_drag_scroll = false; | 66 | bool is_drag_scroll = false; |
| 67 | 67 | ||
| 68 | __attribute__((weak)) void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v) { | 68 | void 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) { | 100 | report_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 | ||
| 154 | bool process_record_kb(uint16_t keycode, keyrecord_t* record) { | 118 | bool 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 | ||
| 242 | void pointing_device_init(void) { | 202 | void 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 | |||
| 250 | void 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 | |||
| 271 | void eeconfig_init_kb(void) { | 208 | void 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 | ||
| 287 | void keyboard_post_init_kb(void) { | 224 | void 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 | ||
| 39 | void process_mouse(report_mouse_t* mouse_report); | ||
| 40 | void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y); | ||
| 41 | void process_wheel(report_mouse_t* mouse_report); | 36 | void process_wheel(report_mouse_t* mouse_report); |
| 42 | void 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. |
| 47 | void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y) { | 47 | void 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 |
| 2 | MCU = atmega32u4 | 2 | MCU = atmega32u4 |
| 3 | 3 | ||
| 4 | # Processor frequency | ||
| 5 | F_CPU = 16000000 | ||
| 6 | |||
| 7 | # Bootloader selection | 4 | # Bootloader selection |
| 8 | BOOTLOADER = atmel-dfu | 5 | BOOTLOADER = atmel-dfu |
| 9 | 6 | ||
| @@ -22,9 +19,10 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality | |||
| 22 | RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow | 19 | RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow |
| 23 | AUDIO_ENABLE = no # Audio output | 20 | AUDIO_ENABLE = no # Audio output |
| 24 | POINTING_DEVICE_ENABLE = yes | 21 | POINTING_DEVICE_ENABLE = yes |
| 22 | POINTING_DEVICE_DRIVER = adns5050 | ||
| 25 | MOUSEKEY_ENABLE = no # Mouse keys | 23 | MOUSEKEY_ENABLE = no # Mouse keys |
| 26 | 24 | ||
| 27 | QUANTUM_LIB_SRC += analog.c | 25 | QUANTUM_LIB_SRC += analog.c |
| 28 | SRC += drivers/sensors/adns5050.c opt_encoder.c | 26 | SRC += opt_encoder.c |
| 29 | 27 | ||
| 30 | DEFAULT_FOLDER = ploopyco/trackball_mini/rev1_001 | 28 | DEFAULT_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 | ||
| 51 | const static float ADNS_X_TRANSFORM = -1.0; | ||
| 52 | const static float ADNS_Y_TRANSFORM = 1.0; | ||
| 53 | |||
| 54 | keyboard_config_t keyboard_config; | 51 | keyboard_config_t keyboard_config; |
| 55 | uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS; | 52 | uint16_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; | |||
| 70 | bool debug_encoder = false; | 67 | bool debug_encoder = false; |
| 71 | bool is_drag_scroll = false; | 68 | bool is_drag_scroll = false; |
| 72 | 69 | ||
| 73 | __attribute__((weak)) void process_wheel_user(report_mouse_t* mouse_report, int16_t h, int16_t v) { | 70 | void 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) { | 101 | void 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; | 108 | report_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 | ||
| 135 | bool process_record_kb(uint16_t keycode, keyrecord_t* record) { | 125 | bool 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 | ||
| 210 | void 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 | |||
| 231 | void 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 | |||
| 252 | void eeconfig_init_kb(void) { | 196 | void 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 | ||
| 34 | void process_mouse(report_mouse_t* mouse_report); | ||
| 35 | void process_mouse_user(report_mouse_t* mouse_report, int16_t x, int16_t y); | ||
| 36 | void process_wheel(report_mouse_t* mouse_report); | 32 | void process_wheel(report_mouse_t* mouse_report); |
| 37 | void 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. |
| 22 | uint8_t scroll_enabled = 0; | 22 | uint8_t scroll_enabled = 0; |
| 23 | uint8_t lock_state = 0; | 23 | uint8_t lock_state = 0; |
| 24 | int16_t delta_x = 0; | 24 | int8_t delta_x = 0; |
| 25 | int16_t delta_y = 0; | 25 | int8_t delta_y = 0; |
| 26 | 26 | ||
| 27 | void process_mouse_user(report_mouse_t *mouse_report, int16_t x, int16_t y) { | 27 | void 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 | ||
| 53 | void keyboard_post_init_user(void) { | 53 | void 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 |
| 2 | MCU = atmega32u4 | 2 | MCU = atmega32u4 |
| 3 | 3 | ||
| 4 | # Processor frequency | ||
| 5 | F_CPU = 16000000 | ||
| 6 | |||
| 7 | # Bootloader selection | 4 | # Bootloader selection |
| 8 | BOOTLOADER = atmel-dfu | 5 | BOOTLOADER = atmel-dfu |
| 9 | 6 | ||
| @@ -22,9 +19,7 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality | |||
| 22 | RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow | 19 | RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow |
| 23 | AUDIO_ENABLE = no # Audio output | 20 | AUDIO_ENABLE = no # Audio output |
| 24 | POINTING_DEVICE_ENABLE = yes | 21 | POINTING_DEVICE_ENABLE = yes |
| 22 | POINTING_DEVICE_DRIVER = adns5050 | ||
| 25 | MOUSEKEY_ENABLE = no # Mouse keys | 23 | MOUSEKEY_ENABLE = no # Mouse keys |
| 26 | 24 | ||
| 27 | QUANTUM_LIB_SRC += analog.c | ||
| 28 | SRC += drivers/sensors/adns5050.c opt_encoder.c | ||
| 29 | |||
| 30 | DEFAULT_FOLDER = ploopyco/trackball_nano/rev1_001 | 25 | DEFAULT_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 | ||
| 50 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; | 51 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; |
| 51 | 52 | ||
| 52 | // Transformation constants for delta-X and delta-Y | ||
| 53 | const static float ADNS_X_TRANSFORM = -1.0; | ||
| 54 | const static float ADNS_Y_TRANSFORM = 1.0; | ||
| 55 | |||
| 56 | keyboard_config_t keyboard_config; | 53 | keyboard_config_t keyboard_config; |
| 57 | uint16_t dpi_array[] = PLOOPY_DPI_OPTIONS; | 54 | uint16_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 |
| 66 | bool is_scroll_clicked = false; | 63 | bool is_scroll_clicked = false; |
| 67 | bool BurstState = false; // init burst state for Trackball module | 64 | bool BurstState = false; // init burst state for Trackball module |
| 68 | uint16_t MotionStart = 0; // Timer for accel, 0 is resting state | 65 | uint16_t MotionStart = 0; // Timer for accel, 0 is resting state |
| 69 | uint16_t lastScroll = 0; // Previous confirmed wheel event | ||
| 70 | uint16_t lastMidClick = 0; // Stops scrollwheel from being read if it was pressed | ||
| 71 | uint8_t OptLowPin = OPT_ENC1; | ||
| 72 | bool 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 | |||
| 100 | bool 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 | 67 | void 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 | ||
| 165 | void 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 | |||
| 186 | void 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 | |||
| 193 | void eeconfig_init_kb(void) { | 95 | void 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 | |||
| 34 | void process_mouse(report_mouse_t* mouse_report); | ||
| 35 | void 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 @@ | |||
| 1 | EEPROM_DRIVER = i2c | 1 | EEPROM_DRIVER = i2c |
| 2 | 2 | ||
| 3 | POINTING_DEVICE_ENABLE = yes | 3 | POINTING_DEVICE_ENABLE = yes |
| 4 | SRC += drivers/sensors/pimoroni_trackball.c | 4 | POINTING_DEVICE_DRIVER = pimoroni_trackball |
| 5 | QUANTUM_LIB_SRC += i2c_master.c | ||
