diff --git a/left/src/module.h b/left/src/module.h new file mode 100644 index 0000000..b622bcd --- /dev/null +++ b/left/src/module.h @@ -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 diff --git a/left/src/slave_protocol_handler.c b/left/src/slave_protocol_handler.c index cb901e3..b60ac48 100644 --- a/left/src/slave_protocol_handler.c +++ b/left/src/slave_protocol_handler.c @@ -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); } diff --git a/left/src/slave_protocol_handler.h b/left/src/slave_protocol_handler.h index 9042e2f..605a182 100644 --- a/left/src/slave_protocol_handler.h +++ b/left/src/slave_protocol_handler.h @@ -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: diff --git a/right/src/main.h b/right/src/main.h index 7889406..c70db75 100644 --- a/right/src/main.h +++ b/right/src/main.h @@ -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: diff --git a/right/src/slave_drivers/uhk_module_driver.c b/right/src/slave_drivers/uhk_module_driver.c index a506b8e..f676aec 100644 --- a/right/src/slave_drivers/uhk_module_driver.c +++ b/right/src/slave_drivers/uhk_module_driver.c @@ -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; diff --git a/right/src/slave_drivers/uhk_module_driver.h b/right/src/slave_drivers/uhk_module_driver.h index ff3160e..64e18e5 100644 --- a/right/src/slave_drivers/uhk_module_driver.h +++ b/right/src/slave_drivers/uhk_module_driver.h @@ -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 { diff --git a/shared/slave_protocol.h b/shared/slave_protocol.h index 2dedb69..feec746 100644 --- a/shared/slave_protocol.h +++ b/shared/slave_protocol.h @@ -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;