17 bool isExtended)
const {
27 if (definition ==
nullptr)
33 const SelectorState selector = ReadSelector(*definition, frame);
34 result.signals.reserve(definition->signals.size());
37 decoded.
definition = std::shared_ptr<const DecodeSignal>(definition, &signal);
39 result.signals.push_back(std::move(decoded));
45DbcDecoder::SelectorState DbcDecoder::ReadSelector(
const DecodeFrame &definition,
47 SelectorState selector;
48 std::size_t count = 0U;
50 if (signal.multiplexing.role == MultiplexRole::Selector) {
51 selector.definition = &signal;
59 selector.valid = signal.
valueType == ValueType::Unsigned &&
61 selector.available = selector.valid && ExtractUnsigned(frame.
data, signal, selector.value);
67 const SelectorState &selector) {
69 std::uint64_t unsignedValue = 0U;
72 (signal.multiplexing.role != MultiplexRole::Unconditional && !selector.valid)) {
75 if (signal.multiplexing.role == MultiplexRole::Branch) {
76 if (selector.definition->length < 64U && signal.multiplexing.value >= (std::uint64_t(1U) << selector.definition->length)) {
79 if (!selector.available) {
80 decoded.status = SignalDecodeStatus::SelectorUnavailable;
83 if (signal.multiplexing.value != selector.value) {
84 decoded.status = SignalDecodeStatus::Inactive;
88 if (!ExtractUnsigned(frame.
data, signal, unsignedValue)) {
89 decoded.status = SignalDecodeStatus::InsufficientPayload;
93 if (signal.
valueType == ValueType::Signed)
99 if (
const std::int64_t *signedValue = std::get_if<std::int64_t>(&decoded.
rawValue))
100 numericValue =
static_cast<double>(*signedValue);
102 numericValue =
static_cast<double>(std::get<std::uint64_t>(decoded.
rawValue));
104 decoded.
valid =
true;
105 decoded.status = SignalDecodeStatus::Valid;
110bool DbcDecoder::ExtractUnsigned(
const std::vector<std::uint8_t> &data,
112 std::uint64_t &value) {
116 if (signal.
byteOrder == ByteOrder::Intel)
119 return ExtractMotorola(data, signal.
startBit, signal.
length, value);
122bool DbcDecoder::ExtractIntel(
const std::vector<std::uint8_t> &data,
123 std::uint32_t startBit,
124 std::uint32_t length,
125 std::uint64_t &value) {
128 for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
129 const std::uint32_t absoluteBit = startBit + bitIndex;
130 const std::uint32_t byteIndex = absoluteBit / 8U;
131 const std::uint32_t bitInByte = absoluteBit % 8U;
133 if (byteIndex >= data.size())
136 const std::uint64_t bitValue =
137 (
static_cast<std::uint64_t
>((data[byteIndex] >> bitInByte) & 0x01U) << bitIndex);
145bool DbcDecoder::ExtractMotorola(
const std::vector<std::uint8_t> &data,
146 std::uint32_t startBit,
147 std::uint32_t length,
148 std::uint64_t &value) {
159 std::size_t byteIndex = startBit / 8U;
160 std::uint32_t bitInByte = startBit % 8U;
162 for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
163 if (byteIndex >= data.size())
167 value |=
static_cast<std::uint64_t
>((data[byteIndex] >> bitInByte) & 0x01U);
169 if (bitInByte == 0U) {
179std::int64_t DbcDecoder::SignExtend(std::uint64_t value, std::uint32_t bitLength) {
180 if ((bitLength == 0U) || (bitLength > 64U))
183 const std::uint64_t signMask = std::uint64_t(1U) << (bitLength - 1U);
184 const std::uint64_t valueMask = (bitLength == 64U)
186 : (std::uint64_t(1U) << bitLength) - 1U;
189 if ((value & signMask) == 0U)
190 return static_cast<std::int64_t
>(value);
193 return -1 -
static_cast<std::int64_t
>((~value) & valueMask);
DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
Decode one raw CAN frame.
std::shared_ptr< const DecodeFrame > FindFrame(const DecodeDatabase &database, std::uint32_t canId, bool isExtended) const
Find frame definition by CAN ID.
Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...
std::shared_ptr< const DecodeFrame > FindFrame(const FrameKey &key) const
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
Runtime-ready frame definition.
Runtime-ready signal definition.
std::shared_ptr< const DecodeFrame > definition
One decoded signal value.
std::shared_ptr< const DecodeSignal > definition
Stable frame identifier: normalized CAN ID and frame type.
Raw CAN frame used for runtime or trace decoding.
std::vector< std::uint8_t > data