16 bool isExtended)
const {
17 const FrameKey key(canId, isExtended);
18 const std::unordered_map<FrameKey, std::size_t, FrameKeyHasher>::const_iterator it =
19 database.frameIndexByKey.find(key);
21 if (it == database.frameIndexByKey.end())
24 const std::size_t index = it->second;
25 if (index >= database.frames.size())
28 return &database.frames[index];
36 if (definition ==
nullptr)
42 const SelectorState selector = ReadSelector(*definition, frame);
44 result.signals.push_back(DecodeOneSignal(signal, frame, selector));
49DbcDecoder::SelectorState DbcDecoder::ReadSelector(
const DecodeFrame &definition,
51 SelectorState selector;
52 std::size_t count = 0U;
54 if (signal.multiplexing.role == MultiplexRole::Selector) {
55 selector.definition = &signal;
63 selector.valid = signal.
valueType == ValueType::Unsigned &&
65 selector.available = selector.valid && ExtractUnsigned(frame.
data, signal, selector.value);
71 const SelectorState &selector) {
73 std::uint64_t unsignedValue = 0U;
78 (signal.multiplexing.role != MultiplexRole::Unconditional && !selector.valid)) {
81 if (signal.multiplexing.role == MultiplexRole::Branch) {
82 if (selector.definition->length < 64U && signal.multiplexing.value >= (std::uint64_t(1U) << selector.definition->length)) {
85 if (!selector.available) {
86 decoded.status = SignalDecodeStatus::SelectorUnavailable;
89 if (signal.multiplexing.value != selector.value) {
90 decoded.status = SignalDecodeStatus::Inactive;
94 if (!ExtractUnsigned(frame.
data, signal, unsignedValue)) {
95 decoded.status = SignalDecodeStatus::InsufficientPayload;
99 if (signal.
valueType == ValueType::Signed)
105 if (
const std::int64_t *signedValue = std::get_if<std::int64_t>(&decoded.
rawValue))
106 numericValue =
static_cast<double>(*signedValue);
108 numericValue =
static_cast<double>(std::get<std::uint64_t>(decoded.
rawValue));
110 decoded.
valid =
true;
111 decoded.status = SignalDecodeStatus::Valid;
116bool DbcDecoder::ExtractUnsigned(
const std::vector<std::uint8_t> &data,
118 std::uint64_t &value) {
122 if (signal.
byteOrder == ByteOrder::Intel)
125 return ExtractMotorola(data, signal.
startBit, signal.
length, value);
128bool DbcDecoder::ExtractIntel(
const std::vector<std::uint8_t> &data,
129 std::uint32_t startBit,
130 std::uint32_t length,
131 std::uint64_t &value) {
134 for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
135 const std::uint32_t absoluteBit = startBit + bitIndex;
136 const std::uint32_t byteIndex = absoluteBit / 8U;
137 const std::uint32_t bitInByte = absoluteBit % 8U;
139 if (byteIndex >= data.size())
142 const std::uint64_t bitValue =
143 (
static_cast<std::uint64_t
>((data[byteIndex] >> bitInByte) & 0x01U) << bitIndex);
151bool DbcDecoder::ExtractMotorola(
const std::vector<std::uint8_t> &data,
152 std::uint32_t startBit,
153 std::uint32_t length,
154 std::uint64_t &value) {
165 std::size_t byteIndex = startBit / 8U;
166 std::uint32_t bitInByte = startBit % 8U;
168 for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
169 if (byteIndex >= data.size())
173 value |=
static_cast<std::uint64_t
>((data[byteIndex] >> bitInByte) & 0x01U);
175 if (bitInByte == 0U) {
185std::int64_t DbcDecoder::SignExtend(std::uint64_t value, std::uint32_t bitLength) {
186 if ((bitLength == 0U) || (bitLength > 64U))
189 const std::uint64_t signMask = std::uint64_t(1U) << (bitLength - 1U);
190 const std::uint64_t valueMask = (bitLength == 64U)
192 : (std::uint64_t(1U) << bitLength) - 1U;
195 if ((value & signMask) == 0U)
196 return static_cast<std::int64_t
>(value);
199 return -1 -
static_cast<std::int64_t
>((~value) & valueMask);
DecodedFrameValue Decode(const DecodeDatabase &database, const RawCanFrame &frame) const
Decode one raw CAN frame.
const DecodeFrame * FindFrame(const DecodeDatabase &database, std::uint32_t canId, bool isExtended) const
Find frame definition by CAN ID.
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
Runtime decode database with fast lookup by CAN ID.
Runtime-ready frame definition.
Runtime-ready signal definition.
const DecodeFrame * definition
One decoded signal value.
const DecodeSignal * definition
Key for fast frame lookup.
Raw CAN frame used for runtime or trace decoding.
std::vector< std::uint8_t > data