From f8e83b139d77f8569577f26ca5cc289d4a59dbdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 5 Oct 2017 20:02:12 +0200 Subject: [PATCH] Rerequest transfer if CRC is invalid. --- right/src/slave_drivers/uhk_module_driver.c | 24 +++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/right/src/slave_drivers/uhk_module_driver.c b/right/src/slave_drivers/uhk_module_driver.c index bb5e1ca..02c666e 100644 --- a/right/src/slave_drivers/uhk_module_driver.c +++ b/right/src/slave_drivers/uhk_module_driver.c @@ -104,13 +104,15 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) status = rx(rxMessage, i2cAddress); *uhkModulePhase = UhkModulePhase_ProcessProtocolVersion; break; - case UhkModulePhase_ProcessProtocolVersion: - if (CRC16_IsMessageValid(rxMessage)) { + case UhkModulePhase_ProcessProtocolVersion: { + bool isMessageValid = CRC16_IsMessageValid(rxMessage); + if (isMessageValid) { uhkModuleState->protocolVersion = rxMessage->data[0]; } status = kStatus_Uhk_NoTransfer; - *uhkModulePhase = UhkModulePhase_RequestModuleId; + *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestProtocolVersion; break; + } // Get module id case UhkModulePhase_RequestModuleId: @@ -124,13 +126,15 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) status = rx(rxMessage, i2cAddress); *uhkModulePhase = UhkModulePhase_ProcessModuleId; break; - case UhkModulePhase_ProcessModuleId: - if (CRC16_IsMessageValid(rxMessage)) { + case UhkModulePhase_ProcessModuleId: { + bool isMessageValid = CRC16_IsMessageValid(rxMessage); + if (isMessageValid) { uhkModuleState->moduleId = rxMessage->data[0]; } status = kStatus_Uhk_NoTransfer; - *uhkModulePhase = UhkModulePhase_RequestModuleFeatures; + *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleFeatures : UhkModulePhase_RequestModuleId; break; + } // Get module features case UhkModulePhase_RequestModuleFeatures: @@ -144,14 +148,16 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) status = rx(rxMessage, i2cAddress); *uhkModulePhase = UhkModulePhase_ProcessModuleFeatures; break; - case UhkModulePhase_ProcessModuleFeatures: - if (CRC16_IsMessageValid(rxMessage)) { + case UhkModulePhase_ProcessModuleFeatures: { + bool isMessageValid = CRC16_IsMessageValid(rxMessage); + if (isMessageValid) { memcpy(&uhkModuleState->features, rxMessage->data, sizeof(uhk_module_features_t)); uhkModuleState->isEnumerated = true; } status = kStatus_Uhk_NoTransfer; - *uhkModulePhase = UhkModulePhase_RequestKeyStates; + *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModuleFeatures; break; + } // Get key states case UhkModulePhase_RequestKeyStates: