diff --git a/keycluster/src/slave_protocol_handler.c b/keycluster/src/slave_protocol_handler.c index 4ceb40f..0283174 100644 --- a/keycluster/src/slave_protocol_handler.c +++ b/keycluster/src/slave_protocol_handler.c @@ -94,7 +94,17 @@ void SlaveTxHandler(void) } case SlaveCommand_RequestKeyStates: BoolBytesToBits(keyMatrix.keyStates, TxMessage.data, MODULE_KEY_COUNT); - TxMessage.length = BOOL_BYTES_TO_BITS_COUNT(MODULE_KEY_COUNT); + uint8_t messageLength = BOOL_BYTES_TO_BITS_COUNT(MODULE_KEY_COUNT); + if (MODULE_POINTER_COUNT) { + pointer_delta_t *pointerDelta = (pointer_delta_t*)(TxMessage.data + messageLength); + pointerDelta->x = 0; + pointerDelta->y = 0; + if (keyMatrix.keyStates[0]) { + pointerDelta->x = 1; + } + messageLength += sizeof(pointer_delta_t); + } + TxMessage.length = messageLength; break; } diff --git a/right/src/slave_drivers/uhk_module_driver.c b/right/src/slave_drivers/uhk_module_driver.c index ea628db..d9a6470 100644 --- a/right/src/slave_drivers/uhk_module_driver.c +++ b/right/src/slave_drivers/uhk_module_driver.c @@ -66,6 +66,9 @@ void UhkModuleSlaveDriver_Init(uint8_t uhkModuleDriverId) uhk_module_i2c_addresses_t *uhkModuleI2cAddresses = moduleIdsToI2cAddresses + uhkModuleDriverId; uhkModuleState->firmwareI2cAddress = uhkModuleI2cAddresses->firmwareI2cAddress; uhkModuleState->bootloaderI2cAddress = uhkModuleI2cAddresses->bootloaderI2cAddress; + + uhkModuleState->pointerDelta.x = 0; + uhkModuleState->pointerDelta.y = 0; } status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) @@ -237,6 +240,12 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) for (uint8_t keyId=0; keyId < uhkModuleState->keyCount; keyId++) { KeyStates[slotId][keyId].current = keyStatesBuffer[keyId]; } + if (uhkModuleState->pointerCount) { + uint8_t keyStatesLength = BOOL_BYTES_TO_BITS_COUNT(uhkModuleState->keyCount); + pointer_delta_t *pointerDelta = (pointer_delta_t*)(rxMessage->data + keyStatesLength); + uhkModuleState->pointerDelta.x += pointerDelta->x; + uhkModuleState->pointerDelta.y += pointerDelta->y; + } } status = kStatus_Uhk_IdleCycle; *uhkModulePhase = UhkModulePhase_SetTestLed; diff --git a/right/src/slave_drivers/uhk_module_driver.h b/right/src/slave_drivers/uhk_module_driver.h index e954316..8a07384 100644 --- a/right/src/slave_drivers/uhk_module_driver.h +++ b/right/src/slave_drivers/uhk_module_driver.h @@ -6,6 +6,7 @@ #include "fsl_common.h" #include "crc16.h" #include "versions.h" + #include "usb_interfaces/usb_interface_mouse.h" // Macros: @@ -81,6 +82,7 @@ uint8_t bootloaderI2cAddress; uint8_t keyCount; uint8_t pointerCount; + pointer_delta_t pointerDelta; } uhk_module_state_t; typedef struct { diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index d2e3199..847f5c6 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -169,6 +169,16 @@ static void processMouseActions() MouseMoveState.xOut = 0; MouseMoveState.yOut = 0; + for (uint8_t moduleId=0; moduleIdpointerCount) { + ActiveUsbMouseReport->x += moduleState->pointerDelta.x; + ActiveUsbMouseReport->y += moduleState->pointerDelta.y; + moduleState->pointerDelta.x = 0; + moduleState->pointerDelta.y = 0; + } + } + processMouseKineticState(&MouseScrollState); ActiveUsbMouseReport->wheelX = MouseScrollState.xOut; ActiveUsbMouseReport->wheelY = MouseScrollState.yOut; diff --git a/shared/slave_protocol.h b/shared/slave_protocol.h index 8136d61..db4e646 100644 --- a/shared/slave_protocol.h +++ b/shared/slave_protocol.h @@ -48,6 +48,11 @@ uint8_t data[I2C_MESSAGE_MAX_PAYLOAD_LENGTH]; } ATTR_PACKED i2c_message_t; + typedef struct { + int16_t x; + int16_t y; + } ATTR_PACKED pointer_delta_t; + // Variables: extern char SlaveSyncString[];