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_PROTOCOL_VERSION 1
#define MODULE_ID ModuleId_LeftKeyboardHalf #define MODULE_ID ModuleId_LeftKeyboardHalf
#define MODULE_KEY_COUNT (KEYBOARD_MATRIX_ROWS_NUM * KEYBOARD_MATRIX_COLS_NUM) #define MODULE_KEY_COUNT (KEYBOARD_MATRIX_ROWS_NUM * KEYBOARD_MATRIX_COLS_NUM)
#define MODULE_HAS_POINTER false #define MODULE_POINTER_COUNT 0
#endif #endif

View File

@@ -64,26 +64,29 @@ void SlaveTxHandler(void)
TxMessage.length = SLAVE_SYNC_STRING_LENGTH; TxMessage.length = SLAVE_SYNC_STRING_LENGTH;
break; break;
} }
case SlaveProperty_ModuleId: {
TxMessage.data[0] = MODULE_ID;
TxMessage.length = 1;
break;
}
case SlaveProperty_ModuleProtocolVersion: { case SlaveProperty_ModuleProtocolVersion: {
memcpy(TxMessage.data, &moduleProtocolVersion, sizeof(version_t)); memcpy(TxMessage.data, &moduleProtocolVersion, sizeof(version_t));
TxMessage.length = sizeof(version_t); TxMessage.length = sizeof(version_t);
break; break;
} }
case SlaveProperty_FirmwareVersion: case SlaveProperty_FirmwareVersion: {
memcpy(TxMessage.data, &firmwareVersion, sizeof(version_t)); memcpy(TxMessage.data, &firmwareVersion, sizeof(version_t));
TxMessage.length = sizeof(version_t); TxMessage.length = sizeof(version_t);
break; break;
} }
case SlaveProperty_Features: { case SlaveProperty_ModuleId: {
uhk_module_features_t *moduleFeatures = (uhk_module_features_t*)&TxMessage.data; TxMessage.data[0] = MODULE_ID;
moduleFeatures->keyCount = MODULE_KEY_COUNT; TxMessage.length = 1;
moduleFeatures->hasPointer = MODULE_HAS_POINTER; break;
TxMessage.length = sizeof(uhk_module_features_t); }
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; break;
} }
} }

View File

@@ -160,29 +160,51 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
uhkModuleState->moduleId = rxMessage->data[0]; uhkModuleState->moduleId = rxMessage->data[0];
} }
status = kStatus_Uhk_NoTransfer; status = kStatus_Uhk_NoTransfer;
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleFeatures : UhkModulePhase_RequestModuleId; *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleKeyCount : UhkModulePhase_RequestModuleId;
break; break;
} }
// Get module features // Get module key count
case UhkModulePhase_RequestModuleFeatures: case UhkModulePhase_RequestModuleKeyCount:
txMessage.data[0] = SlaveCommand_RequestProperty; txMessage.data[0] = SlaveCommand_RequestProperty;
txMessage.data[1] = SlaveProperty_Features; txMessage.data[1] = SlaveProperty_KeyCount;
txMessage.length = 2; txMessage.length = 2;
status = tx(i2cAddress); status = tx(i2cAddress);
*uhkModulePhase = UhkModulePhase_ReceiveModuleFeatures; *uhkModulePhase = UhkModulePhase_ReceiveModuleKeyCount;
break; break;
case UhkModulePhase_ReceiveModuleFeatures: case UhkModulePhase_ReceiveModuleKeyCount:
status = rx(rxMessage, i2cAddress); status = rx(rxMessage, i2cAddress);
*uhkModulePhase = UhkModulePhase_ProcessModuleFeatures; *uhkModulePhase = UhkModulePhase_ProcessModuleKeyCount;
break; break;
case UhkModulePhase_ProcessModuleFeatures: { case UhkModulePhase_ProcessModuleKeyCount: {
bool isMessageValid = CRC16_IsMessageValid(rxMessage); bool isMessageValid = CRC16_IsMessageValid(rxMessage);
if (isMessageValid) { if (isMessageValid) {
memcpy(&uhkModuleState->features, rxMessage->data, sizeof(uhk_module_features_t)); uhkModuleState->keyCount = rxMessage->data[0];
} }
status = kStatus_Uhk_NoTransfer; 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; break;
} }
@@ -200,8 +222,8 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
case UhkModulePhase_ProcessKeystates: case UhkModulePhase_ProcessKeystates:
if (CRC16_IsMessageValid(rxMessage)) { if (CRC16_IsMessageValid(rxMessage)) {
uint8_t slotId = uhkModuleDriverId + 1; uint8_t slotId = uhkModuleDriverId + 1;
BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->features.keyCount); BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->keyCount);
for (uint8_t keyId=0; keyId<uhkModuleState->features.keyCount; keyId++) { for (uint8_t keyId=0; keyId<uhkModuleState->keyCount; keyId++) {
KeyStates[slotId][keyId].current = keyStatesBuffer[keyId]; KeyStates[slotId][keyId].current = keyStatesBuffer[keyId];
} }
} }

View File

@@ -44,10 +44,15 @@
UhkModulePhase_ReceiveModuleId, UhkModulePhase_ReceiveModuleId,
UhkModulePhase_ProcessModuleId, UhkModulePhase_ProcessModuleId,
// Get module features // Get module key count
UhkModulePhase_RequestModuleFeatures, UhkModulePhase_RequestModuleKeyCount,
UhkModulePhase_ReceiveModuleFeatures, UhkModulePhase_ReceiveModuleKeyCount,
UhkModulePhase_ProcessModuleFeatures, UhkModulePhase_ProcessModuleKeyCount,
// Get module key count
UhkModulePhase_RequestModulePointerCount,
UhkModulePhase_ReceiveModulePointerCount,
UhkModulePhase_ProcessModulePointerCount,
// Get key states // Get key states
UhkModulePhase_RequestKeyStates, UhkModulePhase_RequestKeyStates,
@@ -76,7 +81,8 @@
i2c_message_t rxMessage; i2c_message_t rxMessage;
uint8_t firmwareI2cAddress; uint8_t firmwareI2cAddress;
uint8_t bootloaderI2cAddress; uint8_t bootloaderI2cAddress;
uhk_module_features_t features; uint8_t keyCount;
uint8_t pointerCount;
} uhk_module_state_t; } uhk_module_state_t;
typedef struct { typedef struct {

View File

@@ -30,7 +30,8 @@
SlaveProperty_ModuleProtocolVersion, SlaveProperty_ModuleProtocolVersion,
SlaveProperty_FirmwareVersion, SlaveProperty_FirmwareVersion,
SlaveProperty_ModuleId, SlaveProperty_ModuleId,
SlaveProperty_Features, SlaveProperty_KeyCount,
SlaveProperty_PointerCount,
} slave_property_t; } slave_property_t;
typedef enum { typedef enum {
@@ -41,11 +42,6 @@
ModuleId_TouchpadRight = 5, ModuleId_TouchpadRight = 5,
} module_id_t; } module_id_t;
typedef struct {
uint8_t keyCount;
bool hasPointer;
} uhk_module_features_t;
typedef struct { typedef struct {
uint8_t length; uint8_t length;
uint16_t crc; uint16_t crc;