Make the modules transfer their firmware version to the device. Fix the message length of the module protocol version.

This commit is contained in:
László Monda
2017-12-15 01:42:58 +01:00
parent d59ba83d99
commit c994a97d03
4 changed files with 43 additions and 3 deletions

View File

@@ -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: {

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -28,6 +28,7 @@
typedef enum {
SlaveProperty_Sync,
SlaveProperty_ModuleProtocolVersion,
SlaveProperty_FirmwareVersion,
SlaveProperty_ModuleId,
SlaveProperty_Features,
} slave_property_t;