Make modules send their features (key count and whether they have pointer input) to the master upon enumeration.
This commit is contained in:
9
left/src/module.h
Normal file
9
left/src/module.h
Normal 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
|
||||
@@ -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_RequestKeyStates:
|
||||
BoolBytesToBits(keyMatrix.keyStates, TxMessage.data, LEFT_KEYBOARD_HALF_KEY_COUNT);
|
||||
TxMessage.length = KEY_STATE_SIZE;
|
||||
CRC16_UpdateMessageChecksum(&TxMessage);
|
||||
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;
|
||||
break;
|
||||
}
|
||||
|
||||
CRC16_UpdateMessageChecksum(&TxMessage);
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user