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 PhysicalConversionFailed
39};
40
43 UnknownFrame,
44 InsufficientPayload,
45 SignalErrors,
46 Valid
47};
48
53 std::shared_ptr<const DecodeSignal> definition;
55 RawSignalValue rawValue = std::uint64_t(0U);
56 double physicalValue = 0.0;
57 bool valid = false;
58 SignalDecodeStatus status = SignalDecodeStatus::InvalidDefinition;
59
61 const std::string *GetValueDescription() const {
62 return valid && definition ? FindValueDescription(definition->valueDescriptions, rawValue) : nullptr;
63 }
64
65 DecodedSignalValue() = default;
66};
67
72 std::shared_ptr<const DecodeFrame> definition;
74 std::vector<DecodedSignalValue> signals;
75 bool valid = false;
76 FrameDecodeStatus status = FrameDecodeStatus::UnknownFrame;
78 DecodedFrameValue() = default;
79};
80
85public:
93 std::shared_ptr<const DecodeFrame> FindFrame(const DecodeDatabase &database,
94 std::uint32_t canId,
95 bool isExtended) const;
96
105 const RawCanFrame &frame) const;
106
107private:
108 static bool IsValidDefinition(const DecodeSignal &signal, std::uint8_t dlc);
109
110 struct SelectorState {
111 const DecodeSignal *definition = nullptr;
112 bool valid = false;
113 bool available = false;
114 std::uint64_t value = 0U;
115 };
116
117 static SelectorState ReadSelector(const DecodeFrame &definition, const RawCanFrame &frame);
118 static DecodedSignalValue DecodeOneSignal(const DecodeSignal &signal,
119 std::uint8_t dlc,
120 const RawCanFrame &frame,
121 const SelectorState &selector);
122
123 static bool ExtractUnsigned(const std::vector<std::uint8_t> &data,
124 const DecodeSignal &signal,
125 std::uint64_t &value);
126
127 static bool ExtractIntel(const std::vector<std::uint8_t> &data,
128 std::uint32_t startBit,
129 std::uint32_t length,
130 std::uint64_t &value);
131
132 static bool ExtractMotorola(const std::vector<std::uint8_t> &data,
133 std::uint32_t startBit,
134 std::uint32_t length,
135 std::uint64_t &value);
136
137 static std::int64_t SignExtend(std::uint64_t value, std::uint32_t bitLength);
138};
139
140#endif /* DBC_DECODER_H */
Runtime CAN decoder using prebuilt decode database.
Definition dbc_decoder.h:84
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...
FrameDecodeStatus
Definition dbc_decoder.h:42
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
Runtime-ready frame definition.
Runtime-ready signal definition.
Fully decoded frame.
Definition dbc_decoder.h:71
std::shared_ptr< const DecodeFrame > definition
Definition dbc_decoder.h:72
FrameDecodeStatus status
Definition dbc_decoder.h:76
One decoded signal value.
Definition dbc_decoder.h:52
RawSignalValue rawValue
Definition dbc_decoder.h:55
std::shared_ptr< const DecodeSignal > definition
Definition dbc_decoder.h:53
const std::string * GetValueDescription() const
Definition dbc_decoder.h:61
Stable frame identifier: normalized CAN ID and frame type.
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