#pragma once #include #include #include #include #include #include #include "tools/cabana/dbc/dbcfile.h" typedef std::set SourceSet; const SourceSet SOURCE_ALL = {-1}; inline bool operator<(const std::shared_ptr &l, const std::shared_ptr &r) { return l.get() < r.get(); } class DBCManager { public: struct Callbacks { std::function signal_added; std::function signal_removed; std::function signal_updated; std::function msg_updated; std::function msg_removed; std::function file_changed; std::function mask_updated; }; DBCManager() = default; bool open(const SourceSet &sources, const std::string &dbc_file_name, std::string *error = nullptr); bool open(const SourceSet &sources, const std::string &name, const std::string &content, std::string *error = nullptr); void close(const SourceSet &sources); void close(DBCFile *dbc_file); void closeAll(); void addSignal(const MessageId &id, const cabana::Signal &sig); void updateSignal(const MessageId &id, const std::string &sig_name, const cabana::Signal &sig); void removeSignal(const MessageId &id, const std::string &sig_name); void updateMsg(const MessageId &id, const std::string &name, uint32_t size, const std::string &node, const std::string &comment); void removeMsg(const MessageId &id); std::string newMsgName(const MessageId &id); std::string newSignalName(const MessageId &id); const std::map &getMessages(uint8_t source); cabana::Msg *msg(const MessageId &id); cabana::Msg* msg(uint8_t source, const std::string &name); std::vector signalNames(); inline int dbcCount() { return allDBCFiles().size(); } int nonEmptyDBCCount(); const SourceSet sources(const DBCFile *dbc_file) const; DBCFile *findDBCFile(const uint8_t source); inline DBCFile *findDBCFile(const MessageId &id) { return findDBCFile(id.source); } std::set allDBCFiles(); void setCallbacks(Callbacks callbacks) { callbacks_ = std::move(callbacks); } private: std::map> dbc_files; Callbacks callbacks_; }; DBCManager *dbc(); std::string toString(const SourceSet &ss); inline std::string msgName(const MessageId &id) { auto msg = dbc()->msg(id); return msg ? msg->name : UNTITLED; }