Skip to content
This repository was archived by the owner on Aug 5, 2022. It is now read-only.

Commit 7e786aa

Browse files
committed
Revert "EnumParameter: value space is irrelevant for serialization"
This reverts commit 0f759ae. Some users expect enum parameters to be printed in "raw" form. This was removed because it was thought to break serialization/deserialization bijection when several enum parameters have the same numerical values. That case cannot be handled anyway so this is a non-issue. Signed-off-by: David Wagner <[email protected]>
1 parent d7b718a commit 7e786aa

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

parameter/EnumParameterType.cpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
#include "ParameterAccessContext.h"
3333
#include "convert.hpp"
3434

35+
#include <iomanip>
36+
3537
#define base CParameterType
3638

3739
using std::string;
@@ -129,20 +131,46 @@ int32_t CEnumParameterType::getMax() const
129131
}
130132

131133
bool CEnumParameterType::fromBlackboard(string &userValue, const uint32_t &value,
132-
CParameterAccessContext & /*ctx*/) const
134+
CParameterAccessContext &ctx) const
133135
{
134136
// Convert the raw value from the blackboard
135137
int32_t signedValue = static_cast<int32_t>(value);
136138
signExtend(signedValue);
137139

138-
// Convert from numerical space to literal space
139-
return getLiteral(signedValue, userValue);
140+
// Take care of format
141+
if (ctx.valueSpaceIsRaw()) {
142+
143+
// Format
144+
std::ostringstream sstream;
145+
146+
// Numerical format requested
147+
if (ctx.outputRawFormatIsHex()) {
148+
149+
// Hexa display with unecessary bits cleared out
150+
sstream << "0x" << std::hex << std::uppercase
151+
<< std::setw(static_cast<int>(getSize() * 2)) << std::setfill('0')
152+
<< makeEncodable(value);
153+
154+
userValue = sstream.str();
155+
} else {
156+
userValue = std::to_string(value);
157+
}
158+
} else {
159+
// Literal display requested (should succeed)
160+
getLiteral(signedValue, userValue);
161+
}
162+
return true;
140163
}
141164

142165
// Value access
143166
bool CEnumParameterType::toBlackboard(int32_t userValue, uint32_t &value,
144167
CParameterAccessContext &parameterAccessContext) const
145168
{
169+
// Take care of format
170+
if (parameterAccessContext.valueSpaceIsRaw()) {
171+
signExtend(userValue);
172+
}
173+
146174
if (!checkValueAgainstSpace(userValue)) {
147175

148176
parameterAccessContext.setError(std::to_string(userValue) +

test/functional-tests/Handle.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,8 @@ static const char *testRawHexBasicSettingsXML = R"(
384384
<IntegerParameter Name="integer_array">0xFFFFFFF6 0x00000000 0x00000008 0x0000000A</IntegerParameter>
385385
<FixedPointParameter ValueSpace="Raw" Name="fix_point">0x24000000</FixedPointParameter>
386386
<FixedPointParameter ValueSpace="Raw" Name="fix_point_array">0x72000000 0x0B000000 0xF0000000</FixedPointParameter>
387-
<EnumParameter Name="enum">five</EnumParameter>
388-
<EnumParameter Name="enum_array">eight min eight min</EnumParameter>
387+
<EnumParameter Name="enum">0x05</EnumParameter>
388+
<EnumParameter Name="enum_array">0x0008 0x8001 0x0008 0x8001</EnumParameter>
389389
<StringParameter Name="string">A string of 32 character.@@@@@@@</StringParameter>
390390
<BitParameterBlock Name="bit_block">
391391
<BitParameter Name="one">0x1</BitParameter>

0 commit comments

Comments
 (0)