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 "init_peripherals.h"
|
||||||
#include "bool_array_converter.h"
|
#include "bool_array_converter.h"
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
|
#include "module.h"
|
||||||
|
|
||||||
i2c_message_t RxMessage;
|
i2c_message_t RxMessage;
|
||||||
i2c_message_t TxMessage;
|
i2c_message_t TxMessage;
|
||||||
@@ -56,10 +57,24 @@ void SlaveTxHandler(void)
|
|||||||
{
|
{
|
||||||
uint8_t commandId = RxMessage.data[0];
|
uint8_t commandId = RxMessage.data[0];
|
||||||
switch (commandId) {
|
switch (commandId) {
|
||||||
case SlaveCommand_RequestKeyStates:
|
case SlaveCommand_RequestProperty: {
|
||||||
BoolBytesToBits(keyMatrix.keyStates, TxMessage.data, LEFT_KEYBOARD_HALF_KEY_COUNT);
|
uint8_t propertyId = RxMessage.data[1];
|
||||||
TxMessage.length = KEY_STATE_SIZE;
|
switch (propertyId) {
|
||||||
CRC16_UpdateMessageChecksum(&TxMessage);
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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_SUCCESS 0
|
||||||
#define PROTOCOL_RESPONSE_GENERIC_ERROR 1
|
#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))
|
#define KEY_STATE_SIZE (LEFT_KEYBOARD_HALF_KEY_COUNT/8 + (LEFT_KEYBOARD_HALF_KEY_COUNT % 8 ? 1 : 0))
|
||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
#define KEYBOARD_MATRIX_COLS_NUM 7
|
#define KEYBOARD_MATRIX_COLS_NUM 7
|
||||||
#define KEYBOARD_MATRIX_ROWS_NUM 5
|
#define KEYBOARD_MATRIX_ROWS_NUM 5
|
||||||
#define LEFT_KEYBOARD_HALF_KEY_COUNT (5*7)
|
|
||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ void UhkModuleSlaveDriver_Init(uint8_t uhkModuleId)
|
|||||||
uhkModuleTargetVars->ledPwmBrightness = 0;
|
uhkModuleTargetVars->ledPwmBrightness = 0;
|
||||||
|
|
||||||
uhk_module_phase_t *uhkModulePhase = &uhkModuleState->phase;
|
uhk_module_phase_t *uhkModulePhase = &uhkModuleState->phase;
|
||||||
*uhkModulePhase = UhkModulePhase_RequestKeyStates;
|
*uhkModulePhase = UhkModulePhase_RequestModuleFeatures;
|
||||||
|
|
||||||
uhk_module_i2c_addresses_t *uhkModuleI2cAddresses = moduleIdsToI2cAddresses + uhkModuleId;
|
uhk_module_i2c_addresses_t *uhkModuleI2cAddresses = moduleIdsToI2cAddresses + uhkModuleId;
|
||||||
uhkModuleState->firmwareI2cAddress = uhkModuleI2cAddresses->firmwareI2cAddress;
|
uhkModuleState->firmwareI2cAddress = uhkModuleI2cAddresses->firmwareI2cAddress;
|
||||||
@@ -69,6 +69,24 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleId)
|
|||||||
i2c_message_t *rxMessage = &uhkModuleState->rxMessage;
|
i2c_message_t *rxMessage = &uhkModuleState->rxMessage;
|
||||||
|
|
||||||
switch (*uhkModulePhase) {
|
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:
|
case UhkModulePhase_RequestKeyStates:
|
||||||
txMessage.data[0] = SlaveCommand_RequestKeyStates;
|
txMessage.data[0] = SlaveCommand_RequestKeyStates;
|
||||||
txMessage.length = 1;
|
txMessage.length = 1;
|
||||||
@@ -81,7 +99,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleId)
|
|||||||
break;
|
break;
|
||||||
case UhkModulePhase_ProcessKeystates:
|
case UhkModulePhase_ProcessKeystates:
|
||||||
if (CRC16_IsMessageValid(rxMessage)) {
|
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;
|
status = kStatus_Uhk_NoTransfer;
|
||||||
*uhkModulePhase = UhkModulePhase_SetTestLed;
|
*uhkModulePhase = UhkModulePhase_SetTestLed;
|
||||||
|
|||||||
@@ -21,6 +21,9 @@
|
|||||||
} uhk_module_id_t;
|
} uhk_module_id_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
UhkModulePhase_RequestModuleFeatures,
|
||||||
|
UhkModulePhase_ReceiveModuleFeatures,
|
||||||
|
UhkModulePhase_ProcessModuleFeatures,
|
||||||
UhkModulePhase_RequestKeyStates,
|
UhkModulePhase_RequestKeyStates,
|
||||||
UhkModulePhase_ReceiveKeystates,
|
UhkModulePhase_ReceiveKeystates,
|
||||||
UhkModulePhase_ProcessKeystates,
|
UhkModulePhase_ProcessKeystates,
|
||||||
@@ -39,6 +42,7 @@
|
|||||||
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;
|
||||||
} uhk_module_state_t;
|
} uhk_module_state_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
@@ -9,12 +9,22 @@
|
|||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
SlaveCommand_RequestProperty,
|
||||||
SlaveCommand_RequestKeyStates,
|
SlaveCommand_RequestKeyStates,
|
||||||
SlaveCommand_SetTestLed,
|
SlaveCommand_SetTestLed,
|
||||||
SlaveCommand_SetLedPwmBrightness,
|
SlaveCommand_SetLedPwmBrightness,
|
||||||
SlaveCommand_JumpToBootloader,
|
SlaveCommand_JumpToBootloader,
|
||||||
} slave_command_t;
|
} slave_command_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SlaveProperty_Features,
|
||||||
|
} slave_property_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;
|
||||||
|
|||||||
Reference in New Issue
Block a user