diff --git a/left/src/module.h b/left/src/module.h index 3aeac75..497b327 100644 --- a/left/src/module.h +++ b/left/src/module.h @@ -3,6 +3,7 @@ // Macros: + #define MODULE_PROTOCOL_VERSION 1 #define MODULE_KEY_COUNT (KEYBOARD_MATRIX_ROWS_NUM * KEYBOARD_MATRIX_COLS_NUM) #define MODULE_HAS_POINTER false diff --git a/left/src/slave_protocol_handler.c b/left/src/slave_protocol_handler.c index 2bb495b..5d6523c 100644 --- a/left/src/slave_protocol_handler.c +++ b/left/src/slave_protocol_handler.c @@ -75,6 +75,11 @@ void SlaveTxHandler(void) TxMessage.length = 1; break; } + case SlaveProperty_ProtocolVersion: { + TxMessage.data[0] = MODULE_PROTOCOL_VERSION; + TxMessage.length = 1; + break; + } case SlaveProperty_Features: { uhk_module_features_t *moduleFeatures = (uhk_module_features_t*)&TxMessage.data; moduleFeatures->keyCount = MODULE_KEY_COUNT; diff --git a/right/src/slave_drivers/uhk_module_driver.c b/right/src/slave_drivers/uhk_module_driver.c index 595eed6..bdf7df0 100644 --- a/right/src/slave_drivers/uhk_module_driver.c +++ b/right/src/slave_drivers/uhk_module_driver.c @@ -87,11 +87,31 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) bool isSyncValid = memcmp(rxMessage->data, SlaveSyncString, SLAVE_SYNC_STRING_LENGTH) == 0; status = kStatus_Uhk_NoTransfer; *uhkModulePhase = isSyncValid && isMessageValid - ? UhkModulePhase_RequestModuleId + ? UhkModulePhase_RequestProtocolVersion : UhkModulePhase_RequestSync; break; } + // Get protocol version + case UhkModulePhase_RequestProtocolVersion: + txMessage.data[0] = SlaveCommand_RequestProperty; + txMessage.data[1] = SlaveProperty_ProtocolVersion; + txMessage.length = 2; + status = tx(i2cAddress); + *uhkModulePhase = UhkModulePhase_ReceiveProtocolVersion; + break; + case UhkModulePhase_ReceiveProtocolVersion: + status = rx(rxMessage, i2cAddress); + *uhkModulePhase = UhkModulePhase_ProcessProtocolVersion; + break; + case UhkModulePhase_ProcessProtocolVersion: + if (CRC16_IsMessageValid(rxMessage)) { + uhkModuleState->protocolVersion = rxMessage->data[0]; + } + status = kStatus_Uhk_NoTransfer; + *uhkModulePhase = UhkModulePhase_RequestModuleId; + break; + // Get module id case UhkModulePhase_RequestModuleId: txMessage.data[0] = SlaveCommand_RequestProperty; diff --git a/right/src/slave_drivers/uhk_module_driver.h b/right/src/slave_drivers/uhk_module_driver.h index 54e8ac7..3474852 100644 --- a/right/src/slave_drivers/uhk_module_driver.h +++ b/right/src/slave_drivers/uhk_module_driver.h @@ -26,6 +26,11 @@ UhkModulePhase_ReceiveSync, UhkModulePhase_ProcessSync, + // Get protocol version + UhkModulePhase_RequestProtocolVersion, + UhkModulePhase_ReceiveProtocolVersion, + UhkModulePhase_ProcessProtocolVersion, + // Get module id UhkModulePhase_RequestModuleId, UhkModulePhase_ReceiveModuleId, @@ -54,6 +59,7 @@ typedef struct { uint8_t moduleId; + uint8_t protocolVersion; uhk_module_phase_t phase; uhk_module_vars_t targetVars; i2c_message_t rxMessage; diff --git a/shared/slave_protocol.h b/shared/slave_protocol.h index 066c0be..c983264 100644 --- a/shared/slave_protocol.h +++ b/shared/slave_protocol.h @@ -27,6 +27,7 @@ typedef enum { SlaveProperty_Sync, + SlaveProperty_ProtocolVersion, SlaveProperty_ModuleId, SlaveProperty_Features, } slave_property_t;