DBC Framework
DBC parsing and CAN signal decoding framework
Loading...
Searching...
No Matches
dbc_decoder.h
Go to the documentation of this file.
1
12#ifndef DBC_DECODER_H
13#define DBC_DECODER_H
14
15#include <cstdint>
16#include <variant>
17#include <vector>
18
19#include "decode_database.h"
20
25 std::uint32_t canId = 0U;
26 bool isExtended = false;
27 std::vector<std::uint8_t> data;
29 RawCanFrame() = default;
30};
31
32enum class SignalDecodeStatus {
33 InvalidDefinition,
34 InsufficientPayload,
35 SelectorUnavailable,
36 Inactive,
37 Valid
38};
39
44 const DecodeSignal *definition = nullptr;
45 RawSignalValue rawValue = std::uint64_t(0U);
46 double physicalValue = 0.0;
47 bool valid = false;
48 SignalDecodeStatus status = SignalDecodeStatus::InvalidDefinition;
49
51 const std::string *GetValueDescription() const {
52 return valid && definition ? FindValueDescription(definition->valueDescriptions, rawValue) : nullptr;
53 }
54
55 DecodedSignalValue() = default;
56};
57
62 const DecodeFrame *definition = nullptr;
63 std::vector<DecodedSignalValue> signals;
64 bool valid = false;
66 DecodedFrameValue() = default;
67};
68
73public:
81 const DecodeFrame *FindFrame(const DecodeDatabase &database,
82 std::uint32_t canId,
83 bool isExtended) const;
84
92 const RawCanFrame &frame) const;
93
94private:
95 struct SelectorState {
96 const DecodeSignal *definition = nullptr;
97 bool valid = false;
98 bool available = false;
99 std::uint64_t value = 0U;
100 };
101
102 static SelectorState ReadSelector(const DecodeFrame &definition, const RawCanFrame &frame);
103 static DecodedSignalValue DecodeOneSignal(const DecodeSignal &signal,
104 const RawCanFrame &frame,
105 const SelectorState &selector);
106
107 static bool ExtractUnsigned(const std::vector<std::uint8_t> &data,
108 const DecodeSignal &signal,
109 std::uint64_t &value);
110
111 static bool ExtractIntel(const std::vector<std::uint8_t> &data,
112 std::uint32_t startBit,
113 std::uint32_t length,
114 std::uint64_t &value);
115
116 static bool ExtractMotorola(const std::vector<std::uint8_t> &data,
117 std::uint32_t startBit,
118 std::uint32_t length,
119 std::uint64_t &value);
120
121 static std::int64_t SignExtend(std::uint64_t value, std::uint32_t bitLength);
122};
123
124#endif /* DBC_DECODER_H */
Runtime CAN decoder using prebuilt decode database.
Definition dbc_decoder.h:72
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.
ValueDescriptions valueDescriptions
Fully decoded frame.
Definition dbc_decoder.h:61
const DecodeFrame * definition
Definition dbc_decoder.h:62
One decoded signal value.
Definition dbc_decoder.h:43
RawSignalValue rawValue
Definition dbc_decoder.h:45
const DecodeSignal * definition
Definition dbc_decoder.h:44
const std::string * GetValueDescription() const
Definition dbc_decoder.h:51
Raw CAN frame used for runtime or trace decoding.
Definition dbc_decoder.h:24
std::vector< std::uint8_t > data
Definition dbc_decoder.h:27
std::uint32_t canId
Definition dbc_decoder.h:25
bool isExtended
Definition dbc_decoder.h:26