You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							85 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							85 lines
						
					
					
						
							2.3 KiB
						
					
					
				| #pragma once
 | |
| 
 | |
| #include <map>
 | |
| #include <QList>
 | |
| #include <QMetaType>
 | |
| #include <QObject>
 | |
| #include <QString>
 | |
| 
 | |
| #include "opendbc/can/common_dbc.h"
 | |
| 
 | |
| const QString UNTITLED = "untitled";
 | |
| 
 | |
| struct MessageId {
 | |
|   uint8_t source = 0;
 | |
|   uint32_t address = 0;
 | |
| 
 | |
|   QString toString() const {
 | |
|     return QString("%1:%2").arg(source).arg(address, 1, 16);
 | |
|   }
 | |
| 
 | |
|   bool operator==(const MessageId &other) const {
 | |
|     return source == other.source && address == other.address;
 | |
|   }
 | |
| 
 | |
|   bool operator!=(const MessageId &other) const {
 | |
|     return !(*this == other);
 | |
|   }
 | |
| 
 | |
|   bool operator<(const MessageId &other) const {
 | |
|     return std::pair{source, address} < std::pair{other.source, other.address};
 | |
|   }
 | |
| 
 | |
|   bool operator>(const MessageId &other) const {
 | |
|     return std::pair{source, address} > std::pair{other.source, other.address};
 | |
|   }
 | |
| };
 | |
| 
 | |
| uint qHash(const MessageId &item);
 | |
| Q_DECLARE_METATYPE(MessageId);
 | |
| 
 | |
| template <>
 | |
| struct std::hash<MessageId> {
 | |
|   std::size_t operator()(const MessageId &k) const noexcept { return qHash(k); }
 | |
| };
 | |
| 
 | |
| typedef QList<std::pair<QString, QString>> ValueDescription;
 | |
| 
 | |
| namespace cabana {
 | |
|   struct Signal {
 | |
|     QString name;
 | |
|     int start_bit, msb, lsb, size;
 | |
|     bool is_signed;
 | |
|     double factor, offset;
 | |
|     bool is_little_endian;
 | |
|     QString min, max, unit;
 | |
|     QString comment;
 | |
|     ValueDescription val_desc;
 | |
|     int precision = 0;
 | |
|     void updatePrecision();
 | |
|     QString formatValue(double value) const;
 | |
|   };
 | |
| 
 | |
|   struct Msg {
 | |
|     QString name;
 | |
|     uint32_t size;
 | |
|     QList<cabana::Signal> sigs;
 | |
| 
 | |
|     std::vector<const cabana::Signal*> getSignals() const;
 | |
|     const cabana::Signal *sig(const QString &sig_name) const {
 | |
|         auto it = std::find_if(sigs.begin(), sigs.end(), [&](auto &s) { return s.name == sig_name; });
 | |
|         return it != sigs.end() ? &(*it) : nullptr;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   bool operator==(const cabana::Signal &l, const cabana::Signal &r);
 | |
|   inline bool operator!=(const cabana::Signal &l, const cabana::Signal &r) { return !(l == r); }
 | |
| }
 | |
| 
 | |
| // Helper functions
 | |
| double get_raw_value(const uint8_t *data, size_t data_size, const cabana::Signal &sig);
 | |
| int bigEndianStartBitsIndex(int start_bit);
 | |
| int bigEndianBitIndex(int index);
 | |
| void updateSigSizeParamsFromRange(cabana::Signal &s, int start_bit, int size);
 | |
| std::pair<int, int> getSignalRange(const cabana::Signal *s);
 | |
| std::vector<std::string> allDBCNames();
 | |
| 
 |