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
34 InvalidDefinition,
35 InsufficientPayload,
36 SelectorUnavailable,
37 Inactive,
38 Valid,
39 PhysicalConversionFailed
40};
41
44 UnknownFrame,
45 InsufficientPayload,
46 SignalErrors,
47 Valid,
48 AmbiguousFrame
49};
50
55 std::shared_ptr<const DecodeSignal> definition;
57 RawSignalValue rawValue = std::uint64_t(0U);
58 double physicalValue = 0.0;
59 bool valid = false;
60 SignalDecodeStatus status = SignalDecodeStatus::InvalidDefinition;
63 const std::string *GetValueDescription() const {
64 return valid && definition ? FindValueDescription(definition->valueDescriptions, rawValue) : nullptr;
65 }
66
67 DecodedSignalValue() = default;
68};
69
74 std::shared_ptr<const DecodeFrame> definition;
76 std::vector<DecodedSignalValue> signals;
77 bool valid = false;
78 FrameDecodeStatus status = FrameDecodeStatus::UnknownFrame;
80 DecodedFrameValue() = default;
81};
82
87public:
95 std::shared_ptr<const DecodeFrame> FindFrame(const DecodeDatabase &database,
96 std::uint32_t canId,
97 bool isExtended) const;
98
107 const RawCanFrame &frame) const;
108
118 const RawCanFrame &frame,
119 const std::vector<SignalKey> &selection) const;
120
121private:
122 static PgnLookupResult ResolveFrame(const DecodeDatabase &database,
123 std::uint32_t canId, bool isExtended);
124
125 DecodedFrameValue DecodeImpl(const DecodeDatabase &database,
126 const RawCanFrame &frame,
127 const std::vector<SignalKey> *selection) const;
128
129 static bool IsValidDefinition(const DecodeSignal &signal, std::uint8_t dlc);
130
131 struct SelectorState {
132 const DecodeSignal *definition = nullptr;
133 bool valid = false;
134 bool available = false;
135 std::uint64_t value = 0U;
136 };
137
138 static SelectorState ReadSelector(const DecodeFrame &definition, const RawCanFrame &frame);
139 static DecodedSignalValue DecodeOneSignal(const DecodeSignal &signal,
140 std::uint8_t dlc,
141 const RawCanFrame &frame,
142 const SelectorState &selector);
143
144 static bool ExtractUnsigned(const std::vector<std::uint8_t> &data,
145 const DecodeSignal &signal,
146 std::uint64_t &value);
147
148 static bool ExtractIntel(const std::vector<std::uint8_t> &data,
149 std::uint32_t startBit,
150 std::uint32_t length,
151 std::uint64_t &value);
152
153 static bool ExtractMotorola(const std::vector<std::uint8_t> &data,
154 std::uint32_t startBit,
155 std::uint32_t length,
156 std::uint64_t &value);
157
158 static std::int64_t SignExtend(std::uint64_t value, std::uint32_t bitLength);
159};
160
161#endif /* DBC_DECODER_H */
Runtime CAN decoder using prebuilt decode database.
Definition dbc_decoder.h:86
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 exact CAN ID first, then unique PGN among explicitly J1939 definitions.
Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...
SignalDecodeStatus
Outcome of signal extraction and physical conversion.
Definition dbc_decoder.h:33
FrameDecodeStatus
Definition dbc_decoder.h:43
Runtime definitions and immutable indexed database.
Runtime-ready frame definition.
Runtime-ready signal definition.
Fully decoded frame.
Definition dbc_decoder.h:73
std::shared_ptr< const DecodeFrame > definition
Definition dbc_decoder.h:74
FrameDecodeStatus status
Definition dbc_decoder.h:78
One decoded signal value.
Definition dbc_decoder.h:54
RawSignalValue rawValue
Definition dbc_decoder.h:57
std::shared_ptr< const DecodeSignal > definition
Definition dbc_decoder.h:55
SignalDecodeStatus status
Definition dbc_decoder.h:60
const std::string * GetValueDescription() const
Definition dbc_decoder.h:63
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