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

9
left/src/module.h Normal file
View File

@@ -0,0 +1,9 @@
#ifndef __MODULE_H__
#define __MODULE_H__
// Macros:
#define LEFT_KEYBOARD_HALF_KEY_COUNT (5*7)
#define MODULE_HAS_POINTER false
#endif

View File

@@ -9,6 +9,7 @@
#include "init_peripherals.h"
#include "bool_array_converter.h"
#include "bootloader.h"
#include "module.h"
i2c_message_t RxMessage;
i2c_message_t TxMessage;
@@ -56,10 +57,24 @@ void SlaveTxHandler(void)
{
uint8_t commandId = RxMessage.data[0];
switch (commandId) {
case SlaveCommand_RequestProperty: {
uint8_t propertyId = RxMessage.data[1];
switch (propertyId) {
case SlaveProperty_Features: {
uhk_module_features_t *moduleFeatures = (uhk_module_features_t*)&TxMessage.data;
moduleFeatures->keyCount = LEFT_KEYBOARD_HALF_KEY_COUNT;
moduleFeatures->hasPointer = MODULE_HAS_POINTER;
TxMessage.length = sizeof(uhk_module_features_t);
break;
}
}
break;
}
case SlaveCommand_RequestKeyStates:
BoolBytesToBits(keyMatrix.keyStates, TxMessage.data, LEFT_KEYBOARD_HALF_KEY_COUNT);
TxMessage.length = KEY_STATE_SIZE;
CRC16_UpdateMessageChecksum(&TxMessage);
break;
}
CRC16_UpdateMessageChecksum(&TxMessage);
}

View File

@@ -12,7 +12,6 @@
#define PROTOCOL_RESPONSE_SUCCESS 0
#define PROTOCOL_RESPONSE_GENERIC_ERROR 1
#define LEFT_KEYBOARD_HALF_KEY_COUNT (KEYBOARD_MATRIX_COLS_NUM*KEYBOARD_MATRIX_ROWS_NUM)
#define KEY_STATE_SIZE (LEFT_KEYBOARD_HALF_KEY_COUNT/8 + (LEFT_KEYBOARD_HALF_KEY_COUNT % 8 ? 1 : 0))
// Variables:

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 {

View File

@@ -9,12 +9,22 @@
// Typedefs:
typedef enum {
SlaveCommand_RequestProperty,
SlaveCommand_RequestKeyStates,
SlaveCommand_SetTestLed,
SlaveCommand_SetLedPwmBrightness,
SlaveCommand_JumpToBootloader,
} slave_command_t;
typedef enum {
SlaveProperty_Features,
} slave_property_t;
typedef struct {
uint8_t keyCount;
bool hasPointer;
} uhk_module_features_t;
typedef struct {
uint8_t length;
uint16_t crc;