#pragma once #include #include "opendbc/can/common_dbc.h" class DBCManager : public QObject { Q_OBJECT public: DBCManager(QObject *parent); ~DBCManager(); void open(const QString &dbc_file_name); void open(const QString &name, const QString &content); QString generateDBC(); void addSignal(const QString &id, const Signal &sig); void updateSignal(const QString &id, const QString &sig_name, const Signal &sig); void removeSignal(const QString &id, const QString &sig_name); static std::pair parseId(const QString &id); inline static std::vector allDBCNames() { return get_dbc_names(); } inline QString name() const { return dbc ? dbc->name.c_str() : ""; } void updateMsg(const QString &id, const QString &name, uint32_t size); inline const DBC *getDBC() const { return dbc; } inline const Msg *msg(const QString &id) const { return msg(parseId(id).second); } inline const Msg *msg(uint32_t address) const { auto it = msg_map.find(address); return it != msg_map.end() ? it->second : nullptr; } signals: void signalAdded(const Signal *sig); void signalRemoved(const Signal *sig); void signalUpdated(const Signal *sig); void msgUpdated(const QString &id); void DBCFileChanged(); private: DBC *dbc = nullptr; std::unordered_map msg_map; }; // TODO: Add helper function in dbc.h double get_raw_value(uint8_t *data, size_t data_size, const Signal &sig); int bigEndianStartBitsIndex(int start_bit); int bigEndianBitIndex(int index); void updateSigSizeParamsFromRange(Signal &s, int from, int to); std::pair getSignalRange(const Signal *s); DBCManager *dbc(); inline QString msgName(const QString &id, const char *def = "untitled") { auto msg = dbc()->msg(id); return msg ? msg->name.c_str() : def; }