Make modules send their features (key count and whether they have pointer input) to the master upon enumeration.

This commit is contained in:
László Monda
2017-09-30 00:08:28 +02:00
parent e7a1d27cde
commit 04047eb128
7 changed files with 59 additions and 5 deletions

View File

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

View File

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

View File

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