diff --git a/left/src/slave_protocol_handler.c b/left/src/slave_protocol_handler.c index 6b0755a..3572272 100644 --- a/left/src/slave_protocol_handler.c +++ b/left/src/slave_protocol_handler.c @@ -21,6 +21,12 @@ static version_t moduleProtocolVersion = { MODULE_PROTOCOL_PATCH_VERSION, }; +static version_t firmwareVersion = { + FIRMWARE_MAJOR_VERSION, + FIRMWARE_MINOR_VERSION, + FIRMWARE_PATCH_VERSION, +}; + void SlaveRxHandler(void) { if (!CRC16_IsMessageValid(&RxMessage)) { @@ -65,7 +71,12 @@ void SlaveTxHandler(void) } case SlaveProperty_ModuleProtocolVersion: { memcpy(TxMessage.data, &moduleProtocolVersion, sizeof(version_t)); - TxMessage.length = 1; + TxMessage.length = sizeof(version_t); + break; + } + case SlaveProperty_FirmwareVersion: + memcpy(TxMessage.data, &firmwareVersion, sizeof(version_t)); + TxMessage.length = sizeof(version_t); break; } case SlaveProperty_Features: { diff --git a/right/src/slave_drivers/uhk_module_driver.c b/right/src/slave_drivers/uhk_module_driver.c index 96a873a..6c41f38 100644 --- a/right/src/slave_drivers/uhk_module_driver.c +++ b/right/src/slave_drivers/uhk_module_driver.c @@ -98,7 +98,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) break; } - // Get protocol version + // Get module protocol version case UhkModulePhase_RequestModuleProtocolVersion: txMessage.data[0] = SlaveCommand_RequestProperty; txMessage.data[1] = SlaveProperty_ModuleProtocolVersion; @@ -116,7 +116,29 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) memcpy(&uhkModuleState->moduleProtocolVersion, rxMessage->data, sizeof(version_t)); } status = kStatus_Uhk_NoTransfer; - *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestModuleProtocolVersion; + *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestFirmwareVersion : UhkModulePhase_RequestModuleProtocolVersion; + break; + } + + // Get firmware version + case UhkModulePhase_RequestFirmwareVersion: + txMessage.data[0] = SlaveCommand_RequestProperty; + txMessage.data[1] = SlaveProperty_FirmwareVersion; + txMessage.length = 2; + status = tx(i2cAddress); + *uhkModulePhase = UhkModulePhase_ReceiveFirmwareVersion; + break; + case UhkModulePhase_ReceiveFirmwareVersion: + status = rx(rxMessage, i2cAddress); + *uhkModulePhase = UhkModulePhase_ProcessFirmwareVersion; + break; + case UhkModulePhase_ProcessFirmwareVersion: { + bool isMessageValid = CRC16_IsMessageValid(rxMessage); + if (isMessageValid) { + memcpy(&uhkModuleState->firmwareVersion, rxMessage->data, sizeof(version_t)); + } + status = kStatus_Uhk_NoTransfer; + *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestFirmwareVersion; break; } diff --git a/right/src/slave_drivers/uhk_module_driver.h b/right/src/slave_drivers/uhk_module_driver.h index 8955f57..3bc3398 100644 --- a/right/src/slave_drivers/uhk_module_driver.h +++ b/right/src/slave_drivers/uhk_module_driver.h @@ -34,6 +34,11 @@ UhkModulePhase_ReceiveModuleProtocolVersion, UhkModulePhase_ProcessModuleProtocolVersion, + // Get firmware version + UhkModulePhase_RequestFirmwareVersion, + UhkModulePhase_ReceiveFirmwareVersion, + UhkModulePhase_ProcessFirmwareVersion, + // Get module id UhkModulePhase_RequestModuleId, UhkModulePhase_ReceiveModuleId, @@ -64,6 +69,7 @@ typedef struct { uint8_t moduleId; version_t moduleProtocolVersion; + version_t firmwareVersion; uhk_module_phase_t phase; uhk_module_vars_t sourceVars; uhk_module_vars_t targetVars; diff --git a/shared/slave_protocol.h b/shared/slave_protocol.h index ebca392..d5009fa 100644 --- a/shared/slave_protocol.h +++ b/shared/slave_protocol.h @@ -28,6 +28,7 @@ typedef enum { SlaveProperty_Sync, SlaveProperty_ModuleProtocolVersion, + SlaveProperty_FirmwareVersion, SlaveProperty_ModuleId, SlaveProperty_Features, } slave_property_t;