#pragma once #include #include #include #include #include #include #include #include "tools/cabana/dbc.h" class DBCManager : public QObject { Q_OBJECT public: DBCManager(QObject *parent) {} ~DBCManager() {} bool open(const QString &dbc_file_name, QString *error = nullptr); bool open(const QString &name, const QString &content, QString *error = nullptr); QString generateDBC(); void addSignal(const MessageId &id, const cabana::Signal &sig); void updateSignal(const MessageId &id, const QString &sig_name, const cabana::Signal &sig); void removeSignal(const MessageId &id, const QString &sig_name); inline int msgCount() const { return msgs.size(); } inline QString name() const { return name_; } void updateMsg(const MessageId &id, const QString &name, uint32_t size); void removeMsg(const MessageId &id); inline std::map getMessages(uint8_t source) { std::map ret; for (auto &[address, msg] : msgs) { MessageId id = {.source = source, .address = address}; ret[id] = msg; } return ret; } inline const cabana::Msg *msg(const MessageId &id) const { return msg(id.address); } inline const cabana::Msg* msg(uint8_t source, const QString &name) { for (auto &[_, msg] : msgs) { if (msg.name == name) { return &msg; } } return nullptr; } QStringList signalNames(); public slots: void updateSources(const QSet &s); signals: void signalAdded(MessageId id, const cabana::Signal *sig); void signalRemoved(const cabana::Signal *sig); void signalUpdated(const cabana::Signal *sig); void msgUpdated(MessageId id); void msgRemoved(MessageId id); void DBCFileChanged(); private: void parseExtraInfo(const QString &content); std::map msgs; QString name_; QSet sources; inline const cabana::Msg *msg(uint32_t address) const { auto it = msgs.find(address); return it != msgs.end() ? &it->second : nullptr; } }; DBCManager *dbc(); inline QString msgName(const MessageId &id) { auto msg = dbc()->msg(id); return msg ? msg->name : UNTITLED; }