|
|
@ -17,16 +17,21 @@ |
|
|
|
#include "tractyl_manuform.h" |
|
|
|
#include "transactions.h" |
|
|
|
#include <string.h> |
|
|
|
#ifdef MOUSEKEY_ENABLE |
|
|
|
# include "mousekey.h" |
|
|
|
#endif |
|
|
|
|
|
|
|
kb_config_data_t kb_config; |
|
|
|
kb_mouse_report_t sync_mouse_report; |
|
|
|
uint16_t transport_mouse_report; |
|
|
|
kb_config_data_t kb_config; |
|
|
|
static report_mouse_t shared_mouse_report; |
|
|
|
extern const pointing_device_driver_t pointing_device_driver; |
|
|
|
|
|
|
|
void kb_pointer_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) { |
|
|
|
if (target2initiator_buffer_size == sizeof(transport_mouse_report)) { |
|
|
|
memcpy(target2initiator_buffer, &transport_mouse_report, sizeof(transport_mouse_report)); |
|
|
|
} |
|
|
|
sync_mouse_report.raw = transport_mouse_report; |
|
|
|
shared_mouse_report = pointing_device_driver.get_report(shared_mouse_report); |
|
|
|
memcpy(target2initiator_buffer, &shared_mouse_report, sizeof(report_mouse_t)); |
|
|
|
shared_mouse_report.x = 0; |
|
|
|
shared_mouse_report.y = 0; |
|
|
|
shared_mouse_report.h = 0; |
|
|
|
shared_mouse_report.v = 0; |
|
|
|
} |
|
|
|
|
|
|
|
void kb_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) { |
|
|
@ -44,9 +49,7 @@ void kb_config_sync_handler(uint8_t initiator2target_buffer_size, const void* in |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void keyboard_pre_init_sync(void) { |
|
|
|
memset(&kb_config, 0, sizeof(kb_config)); |
|
|
|
} |
|
|
|
void keyboard_pre_init_sync(void) { memset(&kb_config, 0, sizeof(kb_config)); } |
|
|
|
|
|
|
|
void keyboard_post_init_sync(void) { |
|
|
|
// Register keyboard state sync split transaction |
|
|
@ -86,3 +89,83 @@ void trackball_set_cpi(uint16_t cpi) { |
|
|
|
pointing_device_set_cpi(cpi); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void pointing_device_task(void) { |
|
|
|
if (!is_keyboard_master()) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
#if defined(POINTING_DEVICE_TASK_THROTTLE) |
|
|
|
static uint32_t last_exec = 0; |
|
|
|
if (timer_elapsed32(last_exec) < 1) { |
|
|
|
return; |
|
|
|
} |
|
|
|
last_exec = timer_read32(); |
|
|
|
#endif |
|
|
|
|
|
|
|
report_mouse_t local_report = pointing_device_get_report(); |
|
|
|
|
|
|
|
// Gather report info |
|
|
|
#ifdef POINTING_DEVICE_MOTION_PIN |
|
|
|
if (!readPin(POINTING_DEVICE_MOTION_PIN)) |
|
|
|
#endif |
|
|
|
#if defined(POINTING_DEVICE_COMBINED) |
|
|
|
local_report = pointing_device_driver.get_report(local_report); |
|
|
|
transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(report_mouse_t), &shared_mouse_report); |
|
|
|
local_report.x = local_report.x | shared_mouse_report.x; |
|
|
|
local_report.y = local_report.y | shared_mouse_report.y; |
|
|
|
local_report.h = local_report.h | shared_mouse_report.h; |
|
|
|
local_report.v = local_report.v | shared_mouse_report.v; |
|
|
|
#elif defined(POINTING_DEVICE_LEFT) |
|
|
|
if (is_keyboard_left()) { |
|
|
|
local_report = pointing_device_driver.get_report(local_report); |
|
|
|
} else { |
|
|
|
transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(report_mouse_t), &local_report); |
|
|
|
} |
|
|
|
#elif defined(POINTING_DEVICE_RIGHT) |
|
|
|
if (!is_keyboard_left()) { |
|
|
|
local_report = pointing_device_driver.get_report(local_report); |
|
|
|
} else { |
|
|
|
transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(report_mouse_t), &local_report); |
|
|
|
} |
|
|
|
#else |
|
|
|
# error "You need to define the side(s) the pointing device is on. POINTING_DEVICE_COMBINED / POINTING_DEVICE_LEFT / POINTING_DEVICE_RIGHT" |
|
|
|
#endif |
|
|
|
|
|
|
|
// Support rotation of the sensor data |
|
|
|
#if defined(POINTING_DEVICE_ROTATION_90) || defined(POINTING_DEVICE_ROTATION_180) || defined(POINTING_DEVICE_ROTATION_270) |
|
|
|
int8_t x = local_report.x, y = local_report.y; |
|
|
|
# if defined(POINTING_DEVICE_ROTATION_90) |
|
|
|
local_report.x = y; |
|
|
|
local_report.y = -x; |
|
|
|
# elif defined(POINTING_DEVICE_ROTATION_180) |
|
|
|
local_report.x = -x; |
|
|
|
local_report.y = -y; |
|
|
|
# elif defined(POINTING_DEVICE_ROTATION_270) |
|
|
|
local_report.x = -y; |
|
|
|
local_report.y = x; |
|
|
|
# else |
|
|
|
# error "How the heck did you get here?!" |
|
|
|
# endif |
|
|
|
#endif |
|
|
|
// Support Inverting the X and Y Axises |
|
|
|
#if defined(POINTING_DEVICE_INVERT_X) |
|
|
|
local_report.x = -local_report.x; |
|
|
|
#endif |
|
|
|
#if defined(POINTING_DEVICE_INVERT_Y) |
|
|
|
local_report.y = -local_report.y; |
|
|
|
#endif |
|
|
|
|
|
|
|
// allow kb to intercept and modify report |
|
|
|
local_report = pointing_device_task_kb(local_report); |
|
|
|
// combine with mouse report to ensure that the combined is sent correctly |
|
|
|
#ifdef MOUSEKEY_ENABLE |
|
|
|
report_mouse_t mousekey_report = mousekey_get_report(); |
|
|
|
local_report.buttons = local_report.buttons | mousekey_report.buttons; |
|
|
|
#endif |
|
|
|
#if defined(POINTING_DEVICE_COMBINED) |
|
|
|
local_report.buttons = local_report.buttons | shared_mouse_report.buttons; |
|
|
|
#endif |
|
|
|
pointing_device_set_report(local_report); |
|
|
|
pointing_device_send(); |
|
|
|
} |