DBC Framework
DBC parsing and CAN signal decoding framework
Loading...
Searching...
No Matches
dbc_statement_handler.h
1// SPDX-License-Identifier: MIT
2#ifndef DBC_STATEMENT_HANDLER_H
3#define DBC_STATEMENT_HANDLER_H
4
5#include "dbc_database.h"
6#include "dbc_diagnostic.h"
7#include "typefactory.h"
8#include <stdexcept>
9#include <string>
10#include <unordered_map>
11
13 std::uint32_t canId;
14 bool isExtended;
15 std::string signalName;
16 ValueDescriptions descriptions;
17 std::size_t lineNumber;
18};
19
21class DbcDiagnosticError : public std::runtime_error {
22public:
23 DbcDiagnosticError(DbcDiagnosticCode code, const std::string &filePath,
24 std::size_t lineNumber, const std::string &message)
25 : std::runtime_error(filePath + ":" + std::to_string(lineNumber) + ": " + message),
26 diagnostic{DbcDiagnosticSeverity::Error, code, filePath, lineNumber, message} {}
27
28 DbcDiagnostic diagnostic;
29};
30
33 DbcDatabase &database;
34 FrameInfo *currentFrame = nullptr;
35 std::size_t lineNumber = 0U;
36 std::vector<PendingValueDescriptions> pendingValues = {};
37
38 std::vector<std::vector<std::size_t>> signalLines = {};
39 void ValidateMultiplexing(const std::string &filePath) const;
40
41 void ResolveValueDescriptions(const std::string &filePath);
42};
43
45public:
46 virtual ~DbcStatementHandler() = default;
47 virtual void Handle(const std::string &line, DbcParseContext &context) const = 0;
48};
49
51public:
52 void Handle(const std::string &line, DbcParseContext &context) const override;
53
54private:
55 static FrameInfo ParseFrameLine(const std::string &line);
56};
57
59public:
60 void Handle(const std::string &line, DbcParseContext &context) const override;
61
62private:
63 static SignalInfo ParseSignalLine(const std::string &line);
64};
65
67public:
68 void Handle(const std::string &line, DbcParseContext &context) const override;
69
70private:
71 static void ParseCommentLine(const std::string &line, DbcDatabase &database);
72};
73
75public:
76 void Handle(const std::string &line, DbcParseContext &context) const override;
77};
78
80public:
81 void Handle(const std::string &line, DbcParseContext &context) const override;
82};
83
86public:
87 void Handle(const std::string &line, DbcParseContext &context) const override;
88};
89
92public:
94
95 template<class Handler>
96 void RegisterType(const std::string &keyword) {
97 m_factory.registerType<Handler>(keyword);
98 m_handlers.insert_or_assign(keyword, m_factory.create(keyword));
99 }
100
102 bool Dispatch(const std::string &line, DbcParseContext &context) const;
103
104private:
105 using HandlerMap = std::unordered_map<std::string, std::shared_ptr<DbcStatementHandler>>;
107 HandlerMap m_handlers;
108};
109
110#endif /* DBC_STATEMENT_HANDLER_H */
bool Dispatch(const std::string &line, DbcParseContext &context) const
Registry-based factory for creating objects by runtime identifier.
Definition typefactory.h:59
BasePtr create(const ClassId &id, Args... args) const
Creates an instance for the given id using provided arguments.
Definition typefactory.h:97
void registerType(const ClassId &id)
Registers a Derived type under the given id.
Definition typefactory.h:76
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
Parsed DBC content stored in a simple internal form.
Describes one CAN frame from a DBC file.
Definition frame_info.h:24
Describes one signal inside a DBC frame.
Definition signal_info.h:24