Files
VkuMonitor/cpp/core/CanDbSignal.cpp
2024-07-03 19:11:29 +09:00

230 lines
4.1 KiB
C++

/*
Copyright (c) 2015, 2016 Hubert Denkmair <hubert@denkmair.de>
This file is part of cangaroo.
cangaroo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
cangaroo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with cangaroo. If not, see <http://www.gnu.org/licenses/>.
*/
#include "CanDbSignal.h"
CanDbSignal::CanDbSignal(CanDbMessage *parent)
: _parent(parent),
_isUnsigned(false),
_isBigEndian(false),
_factor(1),
_offset(0),
_min(0),
_max(0),
_isMuxer(false),
_isMuxed(false),
_muxValue(0)
{
}
QString CanDbSignal::name() const
{
return _name;
}
void CanDbSignal::setName(const QString &name)
{
_name = name;
}
uint8_t CanDbSignal::startBit() const
{
return _startBit;
}
void CanDbSignal::setStartBit(uint8_t startBit)
{
_startBit = startBit;
}
uint8_t CanDbSignal::length() const
{
return _length;
}
void CanDbSignal::setLength(uint8_t length)
{
_length = length;
}
QString CanDbSignal::comment() const
{
return _comment;
}
void CanDbSignal::setComment(const QString &comment)
{
_comment = comment;
}
QString CanDbSignal::getValueName(const uint64_t value) const
{
if (_valueTable.contains(value)) {
return _valueTable[value];
} else {
return QString();
}
}
void CanDbSignal::setValueName(const uint64_t value, const QString &name)
{
_valueTable[value] = name;
}
double CanDbSignal::convertRawValueToPhysical(const uint64_t rawValue)
{
if (isUnsigned()) {
uint64_t v = rawValue;
return v * _factor + _offset;
} else {
// TODO check with DBC that actually contains signed values?!
int64_t v = (int64_t)(rawValue<<(64-_length));
v>>=(64-_length);
return v * _factor + _offset;
}
}
double CanDbSignal::extractPhysicalFromMessage(const CanMessage &msg)
{
return convertRawValueToPhysical(extractRawDataFromMessage(msg));
}
double CanDbSignal::getFactor() const
{
return _factor;
}
void CanDbSignal::setFactor(double factor)
{
_factor = factor;
}
double CanDbSignal::getOffset() const
{
return _offset;
}
void CanDbSignal::setOffset(double offset)
{
_offset = offset;
}
double CanDbSignal::getMinimumValue() const
{
return _min;
}
void CanDbSignal::setMinimumValue(double min)
{
_min = min;
}
double CanDbSignal::getMaximumValue() const
{
return _max;
}
void CanDbSignal::setMaximumValue(double max)
{
_max = max;
}
QString CanDbSignal::getUnit() const
{
return _unit;
}
void CanDbSignal::setUnit(const QString &unit)
{
_unit = unit;
}
bool CanDbSignal::isUnsigned() const
{
return _isUnsigned;
}
void CanDbSignal::setUnsigned(bool isUnsigned)
{
_isUnsigned = isUnsigned;
}
bool CanDbSignal::isBigEndian() const
{
return _isBigEndian;
}
void CanDbSignal::setIsBigEndian(bool isBigEndian)
{
_isBigEndian = isBigEndian;
}
bool CanDbSignal::isMuxer() const
{
return _isMuxer;
}
void CanDbSignal::setIsMuxer(bool isMuxer)
{
_isMuxer = isMuxer;
}
bool CanDbSignal::isMuxed() const
{
return _isMuxed;
}
void CanDbSignal::setIsMuxed(bool isMuxed)
{
_isMuxed = isMuxed;
}
uint32_t CanDbSignal::getMuxValue() const
{
return _muxValue;
}
void CanDbSignal::setMuxValue(const uint32_t &muxValue)
{
_muxValue = muxValue;
}
bool CanDbSignal::isPresentInMessage(const CanMessage &msg)
{
if ((_startBit + _length)>(8*msg.getLength())) {
return false;
}
if (!_isMuxed) { return true; }
CanDbSignal *muxer = _parent->getMuxer();
if (!muxer) { return false; }
return _muxValue == muxer->extractRawDataFromMessage(msg);
}
uint64_t CanDbSignal::extractRawDataFromMessage(const CanMessage &msg)
{
return msg.extractRawSignal(startBit(), length(), isBigEndian());
}