Make modules send their features (key count and whether they have pointer input) to the master upon enumeration.
This commit is contained in:
@@ -11,7 +11,6 @@
|
||||
|
||||
#define KEYBOARD_MATRIX_COLS_NUM 7
|
||||
#define KEYBOARD_MATRIX_ROWS_NUM 5
|
||||
#define LEFT_KEYBOARD_HALF_KEY_COUNT (5*7)
|
||||
|
||||
// Variables:
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ void UhkModuleSlaveDriver_Init(uint8_t uhkModuleId)
|
||||
uhkModuleTargetVars->ledPwmBrightness = 0;
|
||||
|
||||
uhk_module_phase_t *uhkModulePhase = &uhkModuleState->phase;
|
||||
*uhkModulePhase = UhkModulePhase_RequestKeyStates;
|
||||
*uhkModulePhase = UhkModulePhase_RequestModuleFeatures;
|
||||
|
||||
uhk_module_i2c_addresses_t *uhkModuleI2cAddresses = moduleIdsToI2cAddresses + uhkModuleId;
|
||||
uhkModuleState->firmwareI2cAddress = uhkModuleI2cAddresses->firmwareI2cAddress;
|
||||
@@ -69,6 +69,24 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleId)
|
||||
i2c_message_t *rxMessage = &uhkModuleState->rxMessage;
|
||||
|
||||
switch (*uhkModulePhase) {
|
||||
case UhkModulePhase_RequestModuleFeatures:
|
||||
txMessage.data[0] = SlaveCommand_RequestProperty;
|
||||
txMessage.data[1] = SlaveProperty_Features;
|
||||
txMessage.length = 2;
|
||||
status = tx(i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ReceiveModuleFeatures;
|
||||
break;
|
||||
case UhkModulePhase_ReceiveModuleFeatures:
|
||||
status = rx(rxMessage, i2cAddress);
|
||||
*uhkModulePhase = UhkModulePhase_ProcessModuleFeatures;
|
||||
break;
|
||||
case UhkModulePhase_ProcessModuleFeatures:
|
||||
if (CRC16_IsMessageValid(rxMessage)) {
|
||||
memcpy(&uhkModuleState->features, rxMessage->data, sizeof(uhk_module_features_t));
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = UhkModulePhase_RequestKeyStates;
|
||||
break;
|
||||
case UhkModulePhase_RequestKeyStates:
|
||||
txMessage.data[0] = SlaveCommand_RequestKeyStates;
|
||||
txMessage.length = 1;
|
||||
@@ -81,7 +99,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleId)
|
||||
break;
|
||||
case UhkModulePhase_ProcessKeystates:
|
||||
if (CRC16_IsMessageValid(rxMessage)) {
|
||||
BoolBitsToBytes(rxMessage->data, CurrentKeyStates[SlotId_LeftKeyboardHalf], LEFT_KEYBOARD_HALF_KEY_COUNT);
|
||||
BoolBitsToBytes(rxMessage->data, CurrentKeyStates[SlotId_LeftKeyboardHalf], uhkModuleState->features.keyCount);
|
||||
}
|
||||
status = kStatus_Uhk_NoTransfer;
|
||||
*uhkModulePhase = UhkModulePhase_SetTestLed;
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
} uhk_module_id_t;
|
||||
|
||||
typedef enum {
|
||||
UhkModulePhase_RequestModuleFeatures,
|
||||
UhkModulePhase_ReceiveModuleFeatures,
|
||||
UhkModulePhase_ProcessModuleFeatures,
|
||||
UhkModulePhase_RequestKeyStates,
|
||||
UhkModulePhase_ReceiveKeystates,
|
||||
UhkModulePhase_ProcessKeystates,
|
||||
@@ -39,6 +42,7 @@
|
||||
i2c_message_t rxMessage;
|
||||
uint8_t firmwareI2cAddress;
|
||||
uint8_t bootloaderI2cAddress;
|
||||
uhk_module_features_t features;
|
||||
} uhk_module_state_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
Reference in New Issue
Block a user