Query module key count and pointer count in separate messages instead of a combined message for better clarity.

This commit is contained in:
László Monda
2017-12-15 02:13:58 +01:00
parent c994a97d03
commit fd43e81e46
5 changed files with 62 additions and 35 deletions

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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; keyId<uhkModuleState->features.keyCount; keyId++) {
BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->keyCount);
for (uint8_t keyId=0; keyId<uhkModuleState->keyCount; keyId++) {
KeyStates[slotId][keyId].current = keyStatesBuffer[keyId];
}
}

View File

@@ -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 {

View File

@@ -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;