Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,11 @@ case class ComponentParameters (
guardedList (hasExternalParameters) (getParamDelegate)
)

private def checkValidityFlag(param: Param, flagValue: String) =
val paramName = param.getName
val validityFlagName = paramValidityFlagName(paramName)
s"this->$validityFlagName == Fw::ParamValid::$flagValue"
private def checkValidityFlag(flag: String, flagValue: String): String =
s"$flag == Fw::ParamValid::$flagValue"

private def checkValidityFlag(param: Param, flagValue: String): String =
checkValidityFlag(s"this->${paramValidityFlagName(param.getName)}", flagValue)

private def checkValidityFlagValidOrDefault(param: Param) =
s"(${checkValidityFlag(param, "VALID")}) || (${checkValidityFlag(param, "DEFAULT")})"
Expand Down Expand Up @@ -427,21 +428,61 @@ case class ComponentParameters (
)
}

private def writeLoadForParam(param: Param) = {
// Generate a block, or an if statement, or an if-else statement
private def writeLoadForParam(param: Param) =
if param.isExternal
then writeLoadForExternalParam(param)
else writeLoadForInternalParam(param)

private def writeLoadForInternalParam(param: Param) =
List.concat(
lines(
s"""|
|_id = _baseId + ${paramIdConstantName(param.getName)};
|_dbValid = this->${outputPortInvokerName(prmGetPort.get)}(0, _id, $paramBufferName);
|this->m_paramLock.lock();"""
),
// seed the default if never loaded
param.default match {
case Some(value) =>
wrapInIf(
checkValidityFlag(param, "UNINIT"),
List.concat(
setDefaultValue(param, value),
setValidityFlagLines(param, "DEFAULT")
)
)
case None => Nil
},
// override from the prm DB iff present
wrapInIf(
checkValidityFlag("_dbValid", "VALID"),
List.concat(
deserializeParam(param),
wrapInIfElse(
"_stat == Fw::FW_SERIALIZE_OK",
setValidityFlagLines(param, "VALID"),
setValidityFlagLines(param, "INVALID")
)
)
),
lines(
"""|
|this->m_paramLock.unlock();"""
),
lines(
s"this->parameterLoaded(${paramIdConstantName(param.getName)}, this->${paramValidityFlagName(param.getName)});"
)
)

private def writeLoadForExternalParam(param: Param) = {
def writeCondition(
condition: => String,
ifBlock: List[Line],
elseBlock: => List[Line]
) =
if param.isExternal && !param.default.isDefined
// External parameter, no default: no condition needed
if !param.default.isDefined
then ifBlock
else if param.default.isDefined
// Default: if and else needed
then wrapInIfElse(condition, ifBlock, elseBlock)
// Internal parameter, no default: if needed
else wrapInIf(condition, ifBlock)
else wrapInIfElse(condition, ifBlock, elseBlock)
List.concat(
getParamFromPort(param),
{
Expand Down Expand Up @@ -491,6 +532,11 @@ case class ComponentParameters (
private def writeLoadFunctionBody = {
val prmGetPortName = prmGetPort.get.getUnqualifiedName
val prmGetIsConnected = outputPortIsConnectedName(prmGetPortName)
// Holds the pre-lock prm DB read result for internal params
val dbValidDecl =
if sortedParams.exists((_, param) => !param.isExternal)
then lines("Fw::ParamValid _dbValid{};")
else Nil
List.concat(
lines(
s"""|Fw::SerializeStatus _stat = Fw::FW_SERIALIZE_OK;
Expand All @@ -501,6 +547,7 @@ case class ComponentParameters (
|Fw::ParamBuffer $paramBufferName;
|"""
),
dbValidDecl,
sortedParams.flatMap((_, param) => writeLoadForParam(param)),
lines(
"""|
Expand Down
2 changes: 1 addition & 1 deletion compiler/tools/fpp-check/test/update-ref-script
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ done > default-update-ref.sh

if test -f update-ref.sh
then
. update-ref.sh
. ./update-ref.sh
fi

for t in $tests
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1665,22 +1665,17 @@ void ActiveParamsComponentBase ::

FwPrmIdType _id{};
Fw::ParamBuffer _paramBuffer;
Fw::ParamValid _dbValid{};

_id = _baseId + PARAMID_PARAMU32;

// Get serialized parameter ParamU32
this->m_param_ParamU32_valid = this->prmGetOut_out(
0,
_id,
_paramBuffer
);

_dbValid = this->prmGetOut_out(0, _id, _paramBuffer);
this->m_paramLock.lock();

// Deserialize parameter
if (this->m_param_ParamU32_valid == Fw::ParamValid::VALID) {
if (_dbValid == Fw::ParamValid::VALID) {
_stat = _paramBuffer.deserializeTo(this->m_ParamU32);
if (_stat != Fw::FW_SERIALIZE_OK) {
if (_stat == Fw::FW_SERIALIZE_OK) {
this->m_param_ParamU32_valid = Fw::ParamValid::VALID;
}
else {
this->m_param_ParamU32_valid = Fw::ParamValid::INVALID;
}
}
Expand All @@ -1689,20 +1684,14 @@ void ActiveParamsComponentBase ::
this->parameterLoaded(PARAMID_PARAMU32, this->m_param_ParamU32_valid);

_id = _baseId + PARAMID_PARAMF64;

// Get serialized parameter ParamF64
this->m_param_ParamF64_valid = this->prmGetOut_out(
0,
_id,
_paramBuffer
);

_dbValid = this->prmGetOut_out(0, _id, _paramBuffer);
this->m_paramLock.lock();

// Deserialize parameter
if (this->m_param_ParamF64_valid == Fw::ParamValid::VALID) {
if (_dbValid == Fw::ParamValid::VALID) {
_stat = _paramBuffer.deserializeTo(this->m_ParamF64);
if (_stat != Fw::FW_SERIALIZE_OK) {
if (_stat == Fw::FW_SERIALIZE_OK) {
this->m_param_ParamF64_valid = Fw::ParamValid::VALID;
}
else {
this->m_param_ParamF64_valid = Fw::ParamValid::INVALID;
}
}
Expand All @@ -1711,48 +1700,34 @@ void ActiveParamsComponentBase ::
this->parameterLoaded(PARAMID_PARAMF64, this->m_param_ParamF64_valid);

_id = _baseId + PARAMID_PARAMSTRING;

// Get serialized parameter ParamString
this->m_param_ParamString_valid = this->prmGetOut_out(
0,
_id,
_paramBuffer
);

_dbValid = this->prmGetOut_out(0, _id, _paramBuffer);
this->m_paramLock.lock();

// Deserialize parameter or use default value
if (this->m_param_ParamString_valid == Fw::ParamValid::VALID) {
_stat = _paramBuffer.deserializeTo(this->m_ParamString);
if (_stat != Fw::FW_SERIALIZE_OK) {
this->m_param_ParamString_valid = Fw::ParamValid::DEFAULT;
}
}
else {
if (this->m_param_ParamString_valid == Fw::ParamValid::UNINIT) {
this->m_ParamString = Fw::String("default");
this->m_param_ParamString_valid = Fw::ParamValid::DEFAULT;
}
if (this->m_param_ParamString_valid == Fw::ParamValid::DEFAULT) {
this->m_ParamString = Fw::String("default");
if (_dbValid == Fw::ParamValid::VALID) {
_stat = _paramBuffer.deserializeTo(this->m_ParamString);
if (_stat == Fw::FW_SERIALIZE_OK) {
this->m_param_ParamString_valid = Fw::ParamValid::VALID;
}
else {
this->m_param_ParamString_valid = Fw::ParamValid::INVALID;
}
}

this->m_paramLock.unlock();
this->parameterLoaded(PARAMID_PARAMSTRING, this->m_param_ParamString_valid);

_id = _baseId + PARAMID_PARAMENUM;

// Get serialized parameter ParamEnum
this->m_param_ParamEnum_valid = this->prmGetOut_out(
0,
_id,
_paramBuffer
);

_dbValid = this->prmGetOut_out(0, _id, _paramBuffer);
this->m_paramLock.lock();

// Deserialize parameter
if (this->m_param_ParamEnum_valid == Fw::ParamValid::VALID) {
if (_dbValid == Fw::ParamValid::VALID) {
_stat = _paramBuffer.deserializeTo(this->m_ParamEnum);
if (_stat != Fw::FW_SERIALIZE_OK) {
if (_stat == Fw::FW_SERIALIZE_OK) {
this->m_param_ParamEnum_valid = Fw::ParamValid::VALID;
}
else {
this->m_param_ParamEnum_valid = Fw::ParamValid::INVALID;
}
}
Expand All @@ -1761,48 +1736,34 @@ void ActiveParamsComponentBase ::
this->parameterLoaded(PARAMID_PARAMENUM, this->m_param_ParamEnum_valid);

_id = _baseId + PARAMID_PARAMARRAY;

// Get serialized parameter ParamArray
this->m_param_ParamArray_valid = this->prmGetOut_out(
0,
_id,
_paramBuffer
);

_dbValid = this->prmGetOut_out(0, _id, _paramBuffer);
this->m_paramLock.lock();

// Deserialize parameter or use default value
if (this->m_param_ParamArray_valid == Fw::ParamValid::VALID) {
_stat = _paramBuffer.deserializeTo(this->m_ParamArray);
if (_stat != Fw::FW_SERIALIZE_OK) {
this->m_param_ParamArray_valid = Fw::ParamValid::DEFAULT;
}
}
else {
if (this->m_param_ParamArray_valid == Fw::ParamValid::UNINIT) {
this->m_ParamArray = A({1, 2, 3});
this->m_param_ParamArray_valid = Fw::ParamValid::DEFAULT;
}
if (this->m_param_ParamArray_valid == Fw::ParamValid::DEFAULT) {
this->m_ParamArray = A({1, 2, 3});
if (_dbValid == Fw::ParamValid::VALID) {
_stat = _paramBuffer.deserializeTo(this->m_ParamArray);
if (_stat == Fw::FW_SERIALIZE_OK) {
this->m_param_ParamArray_valid = Fw::ParamValid::VALID;
}
else {
this->m_param_ParamArray_valid = Fw::ParamValid::INVALID;
}
}

this->m_paramLock.unlock();
this->parameterLoaded(PARAMID_PARAMARRAY, this->m_param_ParamArray_valid);

_id = _baseId + PARAMID_PARAMSTRUCT;

// Get serialized parameter ParamStruct
this->m_param_ParamStruct_valid = this->prmGetOut_out(
0,
_id,
_paramBuffer
);

_dbValid = this->prmGetOut_out(0, _id, _paramBuffer);
this->m_paramLock.lock();

// Deserialize parameter
if (this->m_param_ParamStruct_valid == Fw::ParamValid::VALID) {
if (_dbValid == Fw::ParamValid::VALID) {
_stat = _paramBuffer.deserializeTo(this->m_ParamStruct);
if (_stat != Fw::FW_SERIALIZE_OK) {
if (_stat == Fw::FW_SERIALIZE_OK) {
this->m_param_ParamStruct_valid = Fw::ParamValid::VALID;
}
else {
this->m_param_ParamStruct_valid = Fw::ParamValid::INVALID;
}
}
Expand Down
Loading
Loading