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.
		
		
		
		
		
			
		
			
				
					
					
						
							119 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
	
	
							119 lines
						
					
					
						
							3.1 KiB
						
					
					
				#pragma once
 | 
						|
 | 
						|
#include <QColor>
 | 
						|
#include <QList>
 | 
						|
#include <QMetaType>
 | 
						|
#include <QString>
 | 
						|
#include <limits>
 | 
						|
 | 
						|
#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<double, QString>> ValueDescription;
 | 
						|
 | 
						|
namespace cabana {
 | 
						|
 | 
						|
class Signal {
 | 
						|
public:
 | 
						|
  Signal() = default;
 | 
						|
  Signal(const Signal &other) = default;
 | 
						|
  void update();
 | 
						|
  bool getValue(const uint8_t *data, size_t data_size, double *val) const;
 | 
						|
  QString formatValue(double value) const;
 | 
						|
  bool operator==(const cabana::Signal &other) const;
 | 
						|
  inline bool operator!=(const cabana::Signal &other) const { return !(*this == other); }
 | 
						|
 | 
						|
  enum class Type {
 | 
						|
    Normal = 0,
 | 
						|
    Multiplexed,
 | 
						|
    Multiplexor
 | 
						|
  };
 | 
						|
 | 
						|
  Type type = Type::Normal;
 | 
						|
  QString name;
 | 
						|
  int start_bit, msb, lsb, size;
 | 
						|
  double factor = 1.0;
 | 
						|
  double offset = 0;
 | 
						|
  bool is_signed;
 | 
						|
  bool is_little_endian;
 | 
						|
  double min, max;
 | 
						|
  QString unit;
 | 
						|
  QString comment;
 | 
						|
  QString receiver_name;
 | 
						|
  ValueDescription val_desc;
 | 
						|
  int precision = 0;
 | 
						|
  QColor color;
 | 
						|
 | 
						|
  // Multiplexed
 | 
						|
  int multiplex_value = 0;
 | 
						|
  Signal *multiplexor = nullptr;
 | 
						|
};
 | 
						|
 | 
						|
class Msg {
 | 
						|
public:
 | 
						|
  Msg() = default;
 | 
						|
  Msg(const Msg &other) { *this = other; }
 | 
						|
  ~Msg();
 | 
						|
  cabana::Signal *addSignal(const cabana::Signal &sig);
 | 
						|
  cabana::Signal *updateSignal(const QString &sig_name, const cabana::Signal &sig);
 | 
						|
  void removeSignal(const QString &sig_name);
 | 
						|
  Msg &operator=(const Msg &other);
 | 
						|
  int indexOf(const cabana::Signal *sig) const;
 | 
						|
  cabana::Signal *sig(const QString &sig_name) const;
 | 
						|
  QString newSignalName();
 | 
						|
  void update();
 | 
						|
  inline const std::vector<cabana::Signal *> &getSignals() const { return sigs; }
 | 
						|
 | 
						|
  uint32_t address;
 | 
						|
  QString name;
 | 
						|
  uint32_t size;
 | 
						|
  QString comment;
 | 
						|
  QString transmitter;
 | 
						|
  std::vector<cabana::Signal *> sigs;
 | 
						|
 | 
						|
  std::vector<uint8_t> mask;
 | 
						|
  cabana::Signal *multiplexor = nullptr;
 | 
						|
};
 | 
						|
 | 
						|
}  // namespace cabana
 | 
						|
 | 
						|
// Helper functions
 | 
						|
double get_raw_value(const uint8_t *data, size_t data_size, const cabana::Signal &sig);
 | 
						|
void updateMsbLsb(cabana::Signal &s);
 | 
						|
inline int flipBitPos(int start_bit) { return 8 * (start_bit / 8) + 7 - start_bit % 8; }
 | 
						|
inline std::vector<std::string> allDBCNames() { return get_dbc_names(); }
 | 
						|
inline QString doubleToString(double value) { return QString::number(value, 'g', std::numeric_limits<double>::digits10); }
 | 
						|
 |