diff --git a/left/src/module.h b/left/src/module.h index 098d50c..79cba53 100644 --- a/left/src/module.h +++ b/left/src/module.h @@ -6,6 +6,6 @@ #define MODULE_PROTOCOL_VERSION 1 #define MODULE_ID ModuleId_LeftKeyboardHalf #define MODULE_KEY_COUNT (KEYBOARD_MATRIX_ROWS_NUM * KEYBOARD_MATRIX_COLS_NUM) - #define MODULE_HAS_POINTER false + #define MODULE_POINTER_COUNT 0 #endif diff --git a/left/src/slave_protocol_handler.c b/left/src/slave_protocol_handler.c index 3572272..c52edc0 100644 --- a/left/src/slave_protocol_handler.c +++ b/left/src/slave_protocol_handler.c @@ -64,26 +64,29 @@ void SlaveTxHandler(void) TxMessage.length = SLAVE_SYNC_STRING_LENGTH; break; } - case SlaveProperty_ModuleId: { - TxMessage.data[0] = MODULE_ID; - TxMessage.length = 1; - break; - } case SlaveProperty_ModuleProtocolVersion: { memcpy(TxMessage.data, &moduleProtocolVersion, sizeof(version_t)); TxMessage.length = sizeof(version_t); break; } - case SlaveProperty_FirmwareVersion: + case SlaveProperty_FirmwareVersion: { memcpy(TxMessage.data, &firmwareVersion, sizeof(version_t)); TxMessage.length = sizeof(version_t); break; } - case SlaveProperty_Features: { - uhk_module_features_t *moduleFeatures = (uhk_module_features_t*)&TxMessage.data; - moduleFeatures->keyCount = MODULE_KEY_COUNT; - moduleFeatures->hasPointer = MODULE_HAS_POINTER; - TxMessage.length = sizeof(uhk_module_features_t); + case SlaveProperty_ModuleId: { + TxMessage.data[0] = MODULE_ID; + TxMessage.length = 1; + break; + } + case SlaveProperty_KeyCount: { + TxMessage.data[0] = MODULE_KEY_COUNT; + TxMessage.length = 1; + break; + } + case SlaveProperty_PointerCount: { + TxMessage.data[0] = MODULE_POINTER_COUNT; + TxMessage.length = 1; break; } } diff --git a/right/src/slave_drivers/uhk_module_driver.c b/right/src/slave_drivers/uhk_module_driver.c index 6c41f38..4af7176 100644 --- a/right/src/slave_drivers/uhk_module_driver.c +++ b/right/src/slave_drivers/uhk_module_driver.c @@ -160,29 +160,51 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) uhkModuleState->moduleId = rxMessage->data[0]; } status = kStatus_Uhk_NoTransfer; - *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleFeatures : UhkModulePhase_RequestModuleId; + *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleKeyCount : UhkModulePhase_RequestModuleId; break; } - // Get module features - case UhkModulePhase_RequestModuleFeatures: + // Get module key count + case UhkModulePhase_RequestModuleKeyCount: txMessage.data[0] = SlaveCommand_RequestProperty; - txMessage.data[1] = SlaveProperty_Features; + txMessage.data[1] = SlaveProperty_KeyCount; txMessage.length = 2; status = tx(i2cAddress); - *uhkModulePhase = UhkModulePhase_ReceiveModuleFeatures; + *uhkModulePhase = UhkModulePhase_ReceiveModuleKeyCount; break; - case UhkModulePhase_ReceiveModuleFeatures: + case UhkModulePhase_ReceiveModuleKeyCount: status = rx(rxMessage, i2cAddress); - *uhkModulePhase = UhkModulePhase_ProcessModuleFeatures; + *uhkModulePhase = UhkModulePhase_ProcessModuleKeyCount; break; - case UhkModulePhase_ProcessModuleFeatures: { + case UhkModulePhase_ProcessModuleKeyCount: { bool isMessageValid = CRC16_IsMessageValid(rxMessage); if (isMessageValid) { - memcpy(&uhkModuleState->features, rxMessage->data, sizeof(uhk_module_features_t)); + uhkModuleState->keyCount = rxMessage->data[0]; } status = kStatus_Uhk_NoTransfer; - *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModuleFeatures; + *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModulePointerCount : UhkModulePhase_RequestModuleKeyCount; + break; + } + + // Get module pointer count + case UhkModulePhase_RequestModulePointerCount: + txMessage.data[0] = SlaveCommand_RequestProperty; + txMessage.data[1] = SlaveProperty_PointerCount; + txMessage.length = 2; + status = tx(i2cAddress); + *uhkModulePhase = UhkModulePhase_ReceiveModulePointerCount; + break; + case UhkModulePhase_ReceiveModulePointerCount: + status = rx(rxMessage, i2cAddress); + *uhkModulePhase = UhkModulePhase_ProcessModulePointerCount; + break; + case UhkModulePhase_ProcessModulePointerCount: { + bool isMessageValid = CRC16_IsMessageValid(rxMessage); + if (isMessageValid) { + uhkModuleState->pointerCount = rxMessage->data[0]; + } + status = kStatus_Uhk_NoTransfer; + *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModulePointerCount; break; } @@ -200,8 +222,8 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) case UhkModulePhase_ProcessKeystates: if (CRC16_IsMessageValid(rxMessage)) { uint8_t slotId = uhkModuleDriverId + 1; - BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->features.keyCount); - for (uint8_t keyId=0; keyIdfeatures.keyCount; keyId++) { + BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->keyCount); + for (uint8_t keyId=0; keyIdkeyCount; keyId++) { KeyStates[slotId][keyId].current = keyStatesBuffer[keyId]; } } diff --git a/right/src/slave_drivers/uhk_module_driver.h b/right/src/slave_drivers/uhk_module_driver.h index 3bc3398..27b3be8 100644 --- a/right/src/slave_drivers/uhk_module_driver.h +++ b/right/src/slave_drivers/uhk_module_driver.h @@ -44,10 +44,15 @@ UhkModulePhase_ReceiveModuleId, UhkModulePhase_ProcessModuleId, - // Get module features - UhkModulePhase_RequestModuleFeatures, - UhkModulePhase_ReceiveModuleFeatures, - UhkModulePhase_ProcessModuleFeatures, + // Get module key count + UhkModulePhase_RequestModuleKeyCount, + UhkModulePhase_ReceiveModuleKeyCount, + UhkModulePhase_ProcessModuleKeyCount, + + // Get module key count + UhkModulePhase_RequestModulePointerCount, + UhkModulePhase_ReceiveModulePointerCount, + UhkModulePhase_ProcessModulePointerCount, // Get key states UhkModulePhase_RequestKeyStates, @@ -76,7 +81,8 @@ i2c_message_t rxMessage; uint8_t firmwareI2cAddress; uint8_t bootloaderI2cAddress; - uhk_module_features_t features; + uint8_t keyCount; + uint8_t pointerCount; } uhk_module_state_t; typedef struct { diff --git a/shared/slave_protocol.h b/shared/slave_protocol.h index d5009fa..8136d61 100644 --- a/shared/slave_protocol.h +++ b/shared/slave_protocol.h @@ -30,7 +30,8 @@ SlaveProperty_ModuleProtocolVersion, SlaveProperty_FirmwareVersion, SlaveProperty_ModuleId, - SlaveProperty_Features, + SlaveProperty_KeyCount, + SlaveProperty_PointerCount, } slave_property_t; typedef enum { @@ -41,11 +42,6 @@ ModuleId_TouchpadRight = 5, } module_id_t; - typedef struct { - uint8_t keyCount; - bool hasPointer; - } uhk_module_features_t; - typedef struct { uint8_t length; uint16_t crc;