Implement handling of SunSpec repeating blocks.
* Update code generator to create code for setting up
SunSpecModelRepeatingBlock subclasses automatically.
* Update SunSpecModel class to provide access to its repeating blocks
and to forward received raw data to its repeating blocks.
* Use updated code generator to regenerate model classes.
This commit is contained in:
parent
2904533b05
commit
3944f2c984
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecFlowBatteryModelRepeatingBlock::SunSpecFlowBatteryModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModel *parent) :
|
SunSpecFlowBatteryModelRepeatingBlock::SunSpecFlowBatteryModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -67,10 +68,8 @@ void SunSpecFlowBatteryModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecFlowBatteryModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecFlowBatteryModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("BatStTBD").isValid())
|
if (m_dataPoints.value("BatStTBD").isValid())
|
||||||
m_batteryStringPointsToBeDetermined = m_dataPoints.value("BatStTBD").toUInt16();
|
m_batteryStringPointsToBeDetermined = m_dataPoints.value("BatStTBD").toUInt16();
|
||||||
@ -86,6 +85,8 @@ SunSpecFlowBatteryModel::SunSpecFlowBatteryModel(SunSpecConnection *connection,
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecFlowBatteryModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecFlowBatteryModel::~SunSpecFlowBatteryModel()
|
SunSpecFlowBatteryModel::~SunSpecFlowBatteryModel()
|
||||||
@ -159,6 +160,34 @@ void SunSpecFlowBatteryModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecFlowBatteryModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecFlowBatteryModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecFlowBatteryModel *model)
|
QDebug operator<<(QDebug debug, SunSpecFlowBatteryModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecFlowBatteryModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecFlowBatteryModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -44,7 +44,7 @@ class SunSpecFlowBatteryModelRepeatingBlock : public SunSpecModelRepeatingBlock
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit SunSpecFlowBatteryModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModel *parent = nullptr);
|
explicit SunSpecFlowBatteryModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModel *parent);
|
||||||
~SunSpecFlowBatteryModelRepeatingBlock() override = default;
|
~SunSpecFlowBatteryModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecFlowBatteryModel *parentModel() const;
|
SunSpecFlowBatteryModel *parentModel() const;
|
||||||
@ -53,7 +53,7 @@ public:
|
|||||||
/* Battery String Points To Be Determined */
|
/* Battery String Points To Be Determined */
|
||||||
quint16 batteryStringPointsToBeDetermined() const;
|
quint16 batteryStringPointsToBeDetermined() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -90,6 +90,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_batteryPointsToBeDetermined = 0;
|
quint16 m_batteryPointsToBeDetermined = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecFlowBatteryModuleModelRepeatingBlock::SunSpecFlowBatteryModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModuleModel *parent) :
|
SunSpecFlowBatteryModuleModelRepeatingBlock::SunSpecFlowBatteryModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModuleModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -67,10 +68,8 @@ void SunSpecFlowBatteryModuleModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecFlowBatteryModuleModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecFlowBatteryModuleModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("StackTBD").isValid())
|
if (m_dataPoints.value("StackTBD").isValid())
|
||||||
m_stackPointsToBeDetermined = m_dataPoints.value("StackTBD").toUInt16();
|
m_stackPointsToBeDetermined = m_dataPoints.value("StackTBD").toUInt16();
|
||||||
@ -86,6 +85,8 @@ SunSpecFlowBatteryModuleModel::SunSpecFlowBatteryModuleModel(SunSpecConnection *
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecFlowBatteryModuleModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecFlowBatteryModuleModel::~SunSpecFlowBatteryModuleModel()
|
SunSpecFlowBatteryModuleModel::~SunSpecFlowBatteryModuleModel()
|
||||||
@ -159,6 +160,34 @@ void SunSpecFlowBatteryModuleModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecFlowBatteryModuleModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecFlowBatteryModuleModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecFlowBatteryModuleModel *model)
|
QDebug operator<<(QDebug debug, SunSpecFlowBatteryModuleModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecFlowBatteryModuleModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecFlowBatteryModuleModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -44,7 +44,7 @@ class SunSpecFlowBatteryModuleModelRepeatingBlock : public SunSpecModelRepeating
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit SunSpecFlowBatteryModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModuleModel *parent = nullptr);
|
explicit SunSpecFlowBatteryModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModuleModel *parent);
|
||||||
~SunSpecFlowBatteryModuleModelRepeatingBlock() override = default;
|
~SunSpecFlowBatteryModuleModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecFlowBatteryModuleModel *parentModel() const;
|
SunSpecFlowBatteryModuleModel *parentModel() const;
|
||||||
@ -53,7 +53,7 @@ public:
|
|||||||
/* Stack Points To Be Determined */
|
/* Stack Points To Be Determined */
|
||||||
quint16 stackPointsToBeDetermined() const;
|
quint16 stackPointsToBeDetermined() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -90,6 +90,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_modulePointsToBeDetermined = 0;
|
quint16 m_modulePointsToBeDetermined = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecFlowBatteryStackModelRepeatingBlock::SunSpecFlowBatteryStackModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStackModel *parent) :
|
SunSpecFlowBatteryStackModelRepeatingBlock::SunSpecFlowBatteryStackModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStackModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -67,10 +68,8 @@ void SunSpecFlowBatteryStackModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecFlowBatteryStackModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecFlowBatteryStackModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("CellTBD").isValid())
|
if (m_dataPoints.value("CellTBD").isValid())
|
||||||
m_cellPointsToBeDetermined = m_dataPoints.value("CellTBD").toUInt16();
|
m_cellPointsToBeDetermined = m_dataPoints.value("CellTBD").toUInt16();
|
||||||
@ -86,6 +85,8 @@ SunSpecFlowBatteryStackModel::SunSpecFlowBatteryStackModel(SunSpecConnection *co
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecFlowBatteryStackModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecFlowBatteryStackModel::~SunSpecFlowBatteryStackModel()
|
SunSpecFlowBatteryStackModel::~SunSpecFlowBatteryStackModel()
|
||||||
@ -159,6 +160,34 @@ void SunSpecFlowBatteryStackModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecFlowBatteryStackModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecFlowBatteryStackModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecFlowBatteryStackModel *model)
|
QDebug operator<<(QDebug debug, SunSpecFlowBatteryStackModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecFlowBatteryStackModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecFlowBatteryStackModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -44,7 +44,7 @@ class SunSpecFlowBatteryStackModelRepeatingBlock : public SunSpecModelRepeatingB
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit SunSpecFlowBatteryStackModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStackModel *parent = nullptr);
|
explicit SunSpecFlowBatteryStackModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStackModel *parent);
|
||||||
~SunSpecFlowBatteryStackModelRepeatingBlock() override = default;
|
~SunSpecFlowBatteryStackModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecFlowBatteryStackModel *parentModel() const;
|
SunSpecFlowBatteryStackModel *parentModel() const;
|
||||||
@ -53,7 +53,7 @@ public:
|
|||||||
/* Cell Points To Be Determined */
|
/* Cell Points To Be Determined */
|
||||||
quint16 cellPointsToBeDetermined() const;
|
quint16 cellPointsToBeDetermined() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -90,6 +90,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_stackPointsToBeDetermined = 0;
|
quint16 m_stackPointsToBeDetermined = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecFlowBatteryStringModelRepeatingBlock::SunSpecFlowBatteryStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStringModel *parent) :
|
SunSpecFlowBatteryStringModelRepeatingBlock::SunSpecFlowBatteryStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStringModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -397,10 +398,8 @@ void SunSpecFlowBatteryStringModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecFlowBatteryStringModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecFlowBatteryStringModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ModIdx").isValid())
|
if (m_dataPoints.value("ModIdx").isValid())
|
||||||
m_moduleIndex = m_dataPoints.value("ModIdx").toUInt16();
|
m_moduleIndex = m_dataPoints.value("ModIdx").toUInt16();
|
||||||
@ -473,6 +472,8 @@ SunSpecFlowBatteryStringModel::SunSpecFlowBatteryStringModel(SunSpecConnection *
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecFlowBatteryStringModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecFlowBatteryStringModel::~SunSpecFlowBatteryStringModel()
|
SunSpecFlowBatteryStringModel::~SunSpecFlowBatteryStringModel()
|
||||||
@ -1116,6 +1117,34 @@ void SunSpecFlowBatteryStringModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecFlowBatteryStringModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecFlowBatteryStringModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecFlowBatteryStringModel *model)
|
QDebug operator<<(QDebug debug, SunSpecFlowBatteryStringModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecFlowBatteryStringModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecFlowBatteryStringModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -167,7 +167,7 @@ public:
|
|||||||
Q_DECLARE_FLAGS(Modevt2Flags, Modevt2)
|
Q_DECLARE_FLAGS(Modevt2Flags, Modevt2)
|
||||||
Q_FLAG(Modevt2)
|
Q_FLAG(Modevt2)
|
||||||
|
|
||||||
explicit SunSpecFlowBatteryStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStringModel *parent = nullptr);
|
explicit SunSpecFlowBatteryStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStringModel *parent);
|
||||||
~SunSpecFlowBatteryStringModelRepeatingBlock() override = default;
|
~SunSpecFlowBatteryStringModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecFlowBatteryStringModel *parentModel() const;
|
SunSpecFlowBatteryStringModel *parentModel() const;
|
||||||
@ -219,7 +219,7 @@ public:
|
|||||||
/* Reason why the module is currently disabled. */
|
/* Reason why the module is currently disabled. */
|
||||||
Moddisrsn disabledReason() const;
|
Moddisrsn disabledReason() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -378,6 +378,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_stringIndex = 0;
|
quint16 m_stringIndex = 0;
|
||||||
quint16 m_moduleCount = 0;
|
quint16 m_moduleCount = 0;
|
||||||
quint16 m_connectedModuleCount = 0;
|
quint16 m_connectedModuleCount = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecFreqWattModelRepeatingBlock::SunSpecFreqWattModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFreqWattModel *parent) :
|
SunSpecFreqWattModelRepeatingBlock::SunSpecFreqWattModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFreqWattModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1564,10 +1565,8 @@ void SunSpecFreqWattModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecFreqWattModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecFreqWattModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1733,6 +1732,8 @@ SunSpecFreqWattModel::SunSpecFreqWattModel(SunSpecConnection *connection, quint1
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecFreqWattModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecFreqWattModel::~SunSpecFreqWattModel()
|
SunSpecFreqWattModel::~SunSpecFreqWattModel()
|
||||||
@ -2066,6 +2067,34 @@ void SunSpecFreqWattModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecFreqWattModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecFreqWattModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecFreqWattModel *model)
|
QDebug operator<<(QDebug debug, SunSpecFreqWattModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecFreqWattModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecFreqWattModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecFreqWattModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFreqWattModel *parent = nullptr);
|
explicit SunSpecFreqWattModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFreqWattModel *parent);
|
||||||
~SunSpecFreqWattModelRepeatingBlock() override = default;
|
~SunSpecFreqWattModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecFreqWattModel *parentModel() const;
|
SunSpecFreqWattModel *parentModel() const;
|
||||||
@ -260,7 +260,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -382,6 +382,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecHfrtcModelRepeatingBlock::SunSpecHfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtcModel *parent) :
|
SunSpecHfrtcModelRepeatingBlock::SunSpecHfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtcModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecHfrtcModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecHfrtcModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecHfrtcModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecHfrtcModel::SunSpecHfrtcModel(SunSpecConnection *connection, quint16 modb
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecHfrtcModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecHfrtcModel::~SunSpecHfrtcModel()
|
SunSpecHfrtcModel::~SunSpecHfrtcModel()
|
||||||
@ -1796,6 +1797,34 @@ void SunSpecHfrtcModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecHfrtcModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecHfrtcModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecHfrtcModel *model)
|
QDebug operator<<(QDebug debug, SunSpecHfrtcModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecHfrtcModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecHfrtcModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecHfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtcModel *parent = nullptr);
|
explicit SunSpecHfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtcModel *parent);
|
||||||
~SunSpecHfrtcModelRepeatingBlock() override = default;
|
~SunSpecHfrtcModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecHfrtcModel *parentModel() const;
|
SunSpecHfrtcModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -341,6 +341,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecHfrtModelRepeatingBlock::SunSpecHfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtModel *parent) :
|
SunSpecHfrtModelRepeatingBlock::SunSpecHfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecHfrtModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecHfrtModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecHfrtModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecHfrtModel::SunSpecHfrtModel(SunSpecConnection *connection, quint16 modbus
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecHfrtModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecHfrtModel::~SunSpecHfrtModel()
|
SunSpecHfrtModel::~SunSpecHfrtModel()
|
||||||
@ -1796,6 +1797,34 @@ void SunSpecHfrtModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecHfrtModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecHfrtModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecHfrtModel *model)
|
QDebug operator<<(QDebug debug, SunSpecHfrtModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecHfrtModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecHfrtModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecHfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtModel *parent = nullptr);
|
explicit SunSpecHfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtModel *parent);
|
||||||
~SunSpecHfrtModelRepeatingBlock() override = default;
|
~SunSpecHfrtModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecHfrtModel *parentModel() const;
|
SunSpecHfrtModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -341,6 +341,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecHfrtxModelRepeatingBlock::SunSpecHfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtxModel *parent) :
|
SunSpecHfrtxModelRepeatingBlock::SunSpecHfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtxModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecHfrtxModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecHfrtxModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecHfrtxModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecHfrtxModel::SunSpecHfrtxModel(SunSpecConnection *connection, quint16 modb
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecHfrtxModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecHfrtxModel::~SunSpecHfrtxModel()
|
SunSpecHfrtxModel::~SunSpecHfrtxModel()
|
||||||
@ -1797,6 +1798,34 @@ void SunSpecHfrtxModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecHfrtxModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecHfrtxModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecHfrtxModel *model)
|
QDebug operator<<(QDebug debug, SunSpecHfrtxModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecHfrtxModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecHfrtxModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecHfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtxModel *parent = nullptr);
|
explicit SunSpecHfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtxModel *parent);
|
||||||
~SunSpecHfrtxModelRepeatingBlock() override = default;
|
~SunSpecHfrtxModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecHfrtxModel *parentModel() const;
|
SunSpecHfrtxModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -346,6 +346,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecHvrtcModelRepeatingBlock::SunSpecHvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtcModel *parent) :
|
SunSpecHvrtcModelRepeatingBlock::SunSpecHvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtcModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecHvrtcModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecHvrtcModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecHvrtcModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecHvrtcModel::SunSpecHvrtcModel(SunSpecConnection *connection, quint16 modb
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecHvrtcModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecHvrtcModel::~SunSpecHvrtcModel()
|
SunSpecHvrtcModel::~SunSpecHvrtcModel()
|
||||||
@ -1796,6 +1797,34 @@ void SunSpecHvrtcModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecHvrtcModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecHvrtcModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecHvrtcModel *model)
|
QDebug operator<<(QDebug debug, SunSpecHvrtcModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecHvrtcModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecHvrtcModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecHvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtcModel *parent = nullptr);
|
explicit SunSpecHvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtcModel *parent);
|
||||||
~SunSpecHvrtcModelRepeatingBlock() override = default;
|
~SunSpecHvrtcModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecHvrtcModel *parentModel() const;
|
SunSpecHvrtcModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -341,6 +341,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecHvrtModelRepeatingBlock::SunSpecHvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtModel *parent) :
|
SunSpecHvrtModelRepeatingBlock::SunSpecHvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecHvrtModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecHvrtModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecHvrtModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecHvrtModel::SunSpecHvrtModel(SunSpecConnection *connection, quint16 modbus
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecHvrtModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecHvrtModel::~SunSpecHvrtModel()
|
SunSpecHvrtModel::~SunSpecHvrtModel()
|
||||||
@ -1796,6 +1797,34 @@ void SunSpecHvrtModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecHvrtModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecHvrtModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecHvrtModel *model)
|
QDebug operator<<(QDebug debug, SunSpecHvrtModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecHvrtModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecHvrtModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecHvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtModel *parent = nullptr);
|
explicit SunSpecHvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtModel *parent);
|
||||||
~SunSpecHvrtModelRepeatingBlock() override = default;
|
~SunSpecHvrtModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecHvrtModel *parentModel() const;
|
SunSpecHvrtModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -341,6 +341,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecHvrtxModelRepeatingBlock::SunSpecHvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtxModel *parent) :
|
SunSpecHvrtxModelRepeatingBlock::SunSpecHvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtxModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecHvrtxModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecHvrtxModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecHvrtxModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecHvrtxModel::SunSpecHvrtxModel(SunSpecConnection *connection, quint16 modb
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecHvrtxModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecHvrtxModel::~SunSpecHvrtxModel()
|
SunSpecHvrtxModel::~SunSpecHvrtxModel()
|
||||||
@ -1797,6 +1798,34 @@ void SunSpecHvrtxModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecHvrtxModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecHvrtxModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecHvrtxModel *model)
|
QDebug operator<<(QDebug debug, SunSpecHvrtxModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecHvrtxModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecHvrtxModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecHvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtxModel *parent = nullptr);
|
explicit SunSpecHvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtxModel *parent);
|
||||||
~SunSpecHvrtxModelRepeatingBlock() override = default;
|
~SunSpecHvrtxModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecHvrtxModel *parentModel() const;
|
SunSpecHvrtxModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -346,6 +346,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecIrradianceModelRepeatingBlock::SunSpecIrradianceModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecIrradianceModel *parent) :
|
SunSpecIrradianceModelRepeatingBlock::SunSpecIrradianceModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecIrradianceModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -131,10 +132,8 @@ void SunSpecIrradianceModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecIrradianceModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecIrradianceModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("GHI").isValid())
|
if (m_dataPoints.value("GHI").isValid())
|
||||||
m_ghi = m_dataPoints.value("GHI").toUInt16();
|
m_ghi = m_dataPoints.value("GHI").toUInt16();
|
||||||
@ -162,6 +161,8 @@ SunSpecIrradianceModel::SunSpecIrradianceModel(SunSpecConnection *connection, qu
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecIrradianceModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecIrradianceModel::~SunSpecIrradianceModel()
|
SunSpecIrradianceModel::~SunSpecIrradianceModel()
|
||||||
@ -217,6 +218,34 @@ void SunSpecIrradianceModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecIrradianceModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecIrradianceModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecIrradianceModel *model)
|
QDebug operator<<(QDebug debug, SunSpecIrradianceModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecIrradianceModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecIrradianceModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -44,7 +44,7 @@ class SunSpecIrradianceModelRepeatingBlock : public SunSpecModelRepeatingBlock
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit SunSpecIrradianceModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecIrradianceModel *parent = nullptr);
|
explicit SunSpecIrradianceModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecIrradianceModel *parent);
|
||||||
~SunSpecIrradianceModelRepeatingBlock() override = default;
|
~SunSpecIrradianceModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecIrradianceModel *parentModel() const;
|
SunSpecIrradianceModel *parentModel() const;
|
||||||
@ -61,7 +61,7 @@ public:
|
|||||||
/* Other Irradiance [W/m2] */
|
/* Other Irradiance [W/m2] */
|
||||||
quint16 oti() const;
|
quint16 oti() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -101,6 +101,9 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecLfrtcModelRepeatingBlock::SunSpecLfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtcModel *parent) :
|
SunSpecLfrtcModelRepeatingBlock::SunSpecLfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtcModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecLfrtcModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecLfrtcModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecLfrtcModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecLfrtcModel::SunSpecLfrtcModel(SunSpecConnection *connection, quint16 modb
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecLfrtcModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecLfrtcModel::~SunSpecLfrtcModel()
|
SunSpecLfrtcModel::~SunSpecLfrtcModel()
|
||||||
@ -1796,6 +1797,34 @@ void SunSpecLfrtcModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecLfrtcModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecLfrtcModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecLfrtcModel *model)
|
QDebug operator<<(QDebug debug, SunSpecLfrtcModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecLfrtcModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecLfrtcModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecLfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtcModel *parent = nullptr);
|
explicit SunSpecLfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtcModel *parent);
|
||||||
~SunSpecLfrtcModelRepeatingBlock() override = default;
|
~SunSpecLfrtcModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecLfrtcModel *parentModel() const;
|
SunSpecLfrtcModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -341,6 +341,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecLfrtModelRepeatingBlock::SunSpecLfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtModel *parent) :
|
SunSpecLfrtModelRepeatingBlock::SunSpecLfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecLfrtModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecLfrtModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecLfrtModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecLfrtModel::SunSpecLfrtModel(SunSpecConnection *connection, quint16 modbus
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecLfrtModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecLfrtModel::~SunSpecLfrtModel()
|
SunSpecLfrtModel::~SunSpecLfrtModel()
|
||||||
@ -1796,6 +1797,34 @@ void SunSpecLfrtModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecLfrtModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecLfrtModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecLfrtModel *model)
|
QDebug operator<<(QDebug debug, SunSpecLfrtModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecLfrtModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecLfrtModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecLfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtModel *parent = nullptr);
|
explicit SunSpecLfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtModel *parent);
|
||||||
~SunSpecLfrtModelRepeatingBlock() override = default;
|
~SunSpecLfrtModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecLfrtModel *parentModel() const;
|
SunSpecLfrtModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -341,6 +341,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecLfrtxModelRepeatingBlock::SunSpecLfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtxModel *parent) :
|
SunSpecLfrtxModelRepeatingBlock::SunSpecLfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtxModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecLfrtxModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecLfrtxModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecLfrtxModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecLfrtxModel::SunSpecLfrtxModel(SunSpecConnection *connection, quint16 modb
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecLfrtxModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecLfrtxModel::~SunSpecLfrtxModel()
|
SunSpecLfrtxModel::~SunSpecLfrtxModel()
|
||||||
@ -1797,6 +1798,34 @@ void SunSpecLfrtxModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecLfrtxModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecLfrtxModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecLfrtxModel *model)
|
QDebug operator<<(QDebug debug, SunSpecLfrtxModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecLfrtxModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecLfrtxModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecLfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtxModel *parent = nullptr);
|
explicit SunSpecLfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtxModel *parent);
|
||||||
~SunSpecLfrtxModelRepeatingBlock() override = default;
|
~SunSpecLfrtxModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecLfrtxModel *parentModel() const;
|
SunSpecLfrtxModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -346,6 +346,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecLithiumIonBankModelRepeatingBlock::SunSpecLithiumIonBankModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonBankModel *parent) :
|
SunSpecLithiumIonBankModelRepeatingBlock::SunSpecLithiumIonBankModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonBankModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -497,10 +498,8 @@ void SunSpecLithiumIonBankModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecLithiumIonBankModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecLithiumIonBankModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("StrNMod").isValid())
|
if (m_dataPoints.value("StrNMod").isValid())
|
||||||
m_moduleCount = m_dataPoints.value("StrNMod").toUInt16();
|
m_moduleCount = m_dataPoints.value("StrNMod").toUInt16();
|
||||||
@ -591,6 +590,8 @@ SunSpecLithiumIonBankModel::SunSpecLithiumIonBankModel(SunSpecConnection *connec
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecLithiumIonBankModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecLithiumIonBankModel::~SunSpecLithiumIonBankModel()
|
SunSpecLithiumIonBankModel::~SunSpecLithiumIonBankModel()
|
||||||
@ -1151,6 +1152,34 @@ void SunSpecLithiumIonBankModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecLithiumIonBankModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecLithiumIonBankModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecLithiumIonBankModel *model)
|
QDebug operator<<(QDebug debug, SunSpecLithiumIonBankModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecLithiumIonBankModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecLithiumIonBankModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -156,7 +156,7 @@ public:
|
|||||||
Q_DECLARE_FLAGS(Strevt1Flags, Strevt1)
|
Q_DECLARE_FLAGS(Strevt1Flags, Strevt1)
|
||||||
Q_FLAG(Strevt1)
|
Q_FLAG(Strevt1)
|
||||||
|
|
||||||
explicit SunSpecLithiumIonBankModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonBankModel *parent = nullptr);
|
explicit SunSpecLithiumIonBankModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonBankModel *parent);
|
||||||
~SunSpecLithiumIonBankModelRepeatingBlock() override = default;
|
~SunSpecLithiumIonBankModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecLithiumIonBankModel *parentModel() const;
|
SunSpecLithiumIonBankModel *parentModel() const;
|
||||||
@ -220,7 +220,7 @@ public:
|
|||||||
/* Pad register. */
|
/* Pad register. */
|
||||||
quint16 pad2() const;
|
quint16 pad2() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -332,6 +332,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_stringCount = 0;
|
quint16 m_stringCount = 0;
|
||||||
quint16 m_connectedStringCount = 0;
|
quint16 m_connectedStringCount = 0;
|
||||||
float m_maxModuleTemperature = 0;
|
float m_maxModuleTemperature = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecLithiumIonModuleModelRepeatingBlock::SunSpecLithiumIonModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonModuleModel *parent) :
|
SunSpecLithiumIonModuleModelRepeatingBlock::SunSpecLithiumIonModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonModuleModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -102,10 +103,8 @@ void SunSpecLithiumIonModuleModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecLithiumIonModuleModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecLithiumIonModuleModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("CellV").isValid())
|
if (m_dataPoints.value("CellV").isValid())
|
||||||
m_cellVoltage = m_dataPoints.value("CellV").toFloatWithSSF(m_parentModel->cellV_SF());
|
m_cellVoltage = m_dataPoints.value("CellV").toFloatWithSSF(m_parentModel->cellV_SF());
|
||||||
@ -127,6 +126,8 @@ SunSpecLithiumIonModuleModel::SunSpecLithiumIonModuleModel(SunSpecConnection *co
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecLithiumIonModuleModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecLithiumIonModuleModel::~SunSpecLithiumIonModuleModel()
|
SunSpecLithiumIonModuleModel::~SunSpecLithiumIonModuleModel()
|
||||||
@ -697,6 +698,34 @@ void SunSpecLithiumIonModuleModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecLithiumIonModuleModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecLithiumIonModuleModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecLithiumIonModuleModel *model)
|
QDebug operator<<(QDebug debug, SunSpecLithiumIonModuleModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecLithiumIonModuleModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecLithiumIonModuleModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
Q_DECLARE_FLAGS(CellstFlags, Cellst)
|
Q_DECLARE_FLAGS(CellstFlags, Cellst)
|
||||||
Q_FLAG(Cellst)
|
Q_FLAG(Cellst)
|
||||||
|
|
||||||
explicit SunSpecLithiumIonModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonModuleModel *parent = nullptr);
|
explicit SunSpecLithiumIonModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonModuleModel *parent);
|
||||||
~SunSpecLithiumIonModuleModelRepeatingBlock() override = default;
|
~SunSpecLithiumIonModuleModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecLithiumIonModuleModel *parentModel() const;
|
SunSpecLithiumIonModuleModel *parentModel() const;
|
||||||
@ -63,7 +63,7 @@ public:
|
|||||||
/* Status of the cell. */
|
/* Status of the cell. */
|
||||||
CellstFlags cellStatus() const;
|
CellstFlags cellStatus() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -152,6 +152,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_stringIndex = 0;
|
quint16 m_stringIndex = 0;
|
||||||
quint16 m_moduleIndex = 0;
|
quint16 m_moduleIndex = 0;
|
||||||
quint16 m_moduleCellCount = 0;
|
quint16 m_moduleCellCount = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecLithiumIonStringModelRepeatingBlock::SunSpecLithiumIonStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonStringModel *parent) :
|
SunSpecLithiumIonStringModelRepeatingBlock::SunSpecLithiumIonStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonStringModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -319,10 +320,8 @@ void SunSpecLithiumIonStringModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecLithiumIonStringModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecLithiumIonStringModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ModNCell").isValid())
|
if (m_dataPoints.value("ModNCell").isValid())
|
||||||
m_moduleCellCount = m_dataPoints.value("ModNCell").toUInt16();
|
m_moduleCellCount = m_dataPoints.value("ModNCell").toUInt16();
|
||||||
@ -383,6 +382,8 @@ SunSpecLithiumIonStringModel::SunSpecLithiumIonStringModel(SunSpecConnection *co
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecLithiumIonStringModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecLithiumIonStringModel::~SunSpecLithiumIonStringModel()
|
SunSpecLithiumIonStringModel::~SunSpecLithiumIonStringModel()
|
||||||
@ -1229,6 +1230,34 @@ void SunSpecLithiumIonStringModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecLithiumIonStringModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecLithiumIonStringModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecLithiumIonStringModel *model)
|
QDebug operator<<(QDebug debug, SunSpecLithiumIonStringModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecLithiumIonStringModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecLithiumIonStringModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -44,7 +44,7 @@ class SunSpecLithiumIonStringModelRepeatingBlock : public SunSpecModelRepeatingB
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit SunSpecLithiumIonStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonStringModel *parent = nullptr);
|
explicit SunSpecLithiumIonStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonStringModel *parent);
|
||||||
~SunSpecLithiumIonStringModelRepeatingBlock() override = default;
|
~SunSpecLithiumIonStringModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecLithiumIonStringModel *parentModel() const;
|
SunSpecLithiumIonStringModel *parentModel() const;
|
||||||
@ -83,7 +83,7 @@ public:
|
|||||||
/* Pad register. */
|
/* Pad register. */
|
||||||
quint16 pad7() const;
|
quint16 pad7() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -313,6 +313,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_stringIndex = 0;
|
quint16 m_stringIndex = 0;
|
||||||
quint16 m_moduleCount = 0;
|
quint16 m_moduleCount = 0;
|
||||||
StFlags m_stringStatus;
|
StFlags m_stringStatus;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecLvrtcModelRepeatingBlock::SunSpecLvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtcModel *parent) :
|
SunSpecLvrtcModelRepeatingBlock::SunSpecLvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtcModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecLvrtcModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecLvrtcModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecLvrtcModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecLvrtcModel::SunSpecLvrtcModel(SunSpecConnection *connection, quint16 modb
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecLvrtcModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecLvrtcModel::~SunSpecLvrtcModel()
|
SunSpecLvrtcModel::~SunSpecLvrtcModel()
|
||||||
@ -1796,6 +1797,34 @@ void SunSpecLvrtcModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecLvrtcModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecLvrtcModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecLvrtcModel *model)
|
QDebug operator<<(QDebug debug, SunSpecLvrtcModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecLvrtcModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecLvrtcModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecLvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtcModel *parent = nullptr);
|
explicit SunSpecLvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtcModel *parent);
|
||||||
~SunSpecLvrtcModelRepeatingBlock() override = default;
|
~SunSpecLvrtcModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecLvrtcModel *parentModel() const;
|
SunSpecLvrtcModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -341,6 +341,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecLvrtModelRepeatingBlock::SunSpecLvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtModel *parent) :
|
SunSpecLvrtModelRepeatingBlock::SunSpecLvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecLvrtModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecLvrtModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecLvrtModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecLvrtModel::SunSpecLvrtModel(SunSpecConnection *connection, quint16 modbus
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecLvrtModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecLvrtModel::~SunSpecLvrtModel()
|
SunSpecLvrtModel::~SunSpecLvrtModel()
|
||||||
@ -1796,6 +1797,34 @@ void SunSpecLvrtModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecLvrtModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecLvrtModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecLvrtModel *model)
|
QDebug operator<<(QDebug debug, SunSpecLvrtModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecLvrtModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecLvrtModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecLvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtModel *parent = nullptr);
|
explicit SunSpecLvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtModel *parent);
|
||||||
~SunSpecLvrtModelRepeatingBlock() override = default;
|
~SunSpecLvrtModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecLvrtModel *parentModel() const;
|
SunSpecLvrtModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -341,6 +341,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecLvrtxModelRepeatingBlock::SunSpecLvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtxModel *parent) :
|
SunSpecLvrtxModelRepeatingBlock::SunSpecLvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtxModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -1326,10 +1327,8 @@ void SunSpecLvrtxModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecLvrtxModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecLvrtxModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ActPt").isValid())
|
if (m_dataPoints.value("ActPt").isValid())
|
||||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||||
@ -1471,6 +1470,8 @@ SunSpecLvrtxModel::SunSpecLvrtxModel(SunSpecConnection *connection, quint16 modb
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecLvrtxModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecLvrtxModel::~SunSpecLvrtxModel()
|
SunSpecLvrtxModel::~SunSpecLvrtxModel()
|
||||||
@ -1797,6 +1798,34 @@ void SunSpecLvrtxModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecLvrtxModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecLvrtxModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecLvrtxModel *model)
|
QDebug operator<<(QDebug debug, SunSpecLvrtxModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecLvrtxModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecLvrtxModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(Readonly)
|
Q_ENUM(Readonly)
|
||||||
|
|
||||||
explicit SunSpecLvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtxModel *parent = nullptr);
|
explicit SunSpecLvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtxModel *parent);
|
||||||
~SunSpecLvrtxModelRepeatingBlock() override = default;
|
~SunSpecLvrtxModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecLvrtxModel *parentModel() const;
|
SunSpecLvrtxModel *parentModel() const;
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||||
Readonly readOnly() const;
|
Readonly readOnly() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -346,6 +346,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
quint16 m_actCrv = 0;
|
quint16 m_actCrv = 0;
|
||||||
ModenaFlags m_modEna;
|
ModenaFlags m_modEna;
|
||||||
quint16 m_winTms = 0;
|
quint16 m_winTms = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -34,6 +34,7 @@
|
|||||||
SunSpecMpptModelRepeatingBlock::SunSpecMpptModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecMpptModel *parent) :
|
SunSpecMpptModelRepeatingBlock::SunSpecMpptModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecMpptModel *parent) :
|
||||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||||
{
|
{
|
||||||
|
m_parentModel = parent;
|
||||||
m_byteOrder = parent->byteOrder();
|
m_byteOrder = parent->byteOrder();
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
}
|
}
|
||||||
@ -201,10 +202,8 @@ void SunSpecMpptModelRepeatingBlock::initDataPoints()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSpecMpptModelRepeatingBlock::processBlockData(const QVector<quint16> blockData)
|
void SunSpecMpptModelRepeatingBlock::processBlockData()
|
||||||
{
|
{
|
||||||
m_blockData = blockData;
|
|
||||||
|
|
||||||
// Update properties according to the data point type
|
// Update properties according to the data point type
|
||||||
if (m_dataPoints.value("ID").isValid())
|
if (m_dataPoints.value("ID").isValid())
|
||||||
m_inputId = m_dataPoints.value("ID").toUInt16();
|
m_inputId = m_dataPoints.value("ID").toUInt16();
|
||||||
@ -247,6 +246,8 @@ SunSpecMpptModel::SunSpecMpptModel(SunSpecConnection *connection, quint16 modbus
|
|||||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||||
|
|
||||||
initDataPoints();
|
initDataPoints();
|
||||||
|
|
||||||
|
connect(this, &SunSpecModel::initFinished, this, &SunSpecMpptModel::setupRepeatingBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
SunSpecMpptModel::~SunSpecMpptModel()
|
SunSpecMpptModel::~SunSpecMpptModel()
|
||||||
@ -435,6 +436,34 @@ void SunSpecMpptModel::processBlockData()
|
|||||||
qCDebug(dcSunSpecModelData()) << this;
|
qCDebug(dcSunSpecModelData()) << this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunSpecMpptModel::setupRepeatingBlocks()
|
||||||
|
{
|
||||||
|
if (!m_repeatingBlocks.isEmpty()) {
|
||||||
|
foreach (SunSpecModelRepeatingBlock *block, m_repeatingBlocks) {
|
||||||
|
block->deleteLater();
|
||||||
|
}
|
||||||
|
m_repeatingBlocks.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto headerLength = 2;
|
||||||
|
const auto repeatingBlocksDataSize = m_blockData.size() - headerLength - m_fixedBlockLength;
|
||||||
|
if (repeatingBlocksDataSize % m_repeatingBlockLength != 0) {
|
||||||
|
qCWarning(dcSunSpecModelData()) << "Unexpected repeating block data size:"
|
||||||
|
<< repeatingBlocksDataSize
|
||||||
|
<< "(repeating block size:"
|
||||||
|
<< m_repeatingBlockLength
|
||||||
|
<< "), extra bytes:"
|
||||||
|
<< repeatingBlocksDataSize % m_repeatingBlockLength;
|
||||||
|
}
|
||||||
|
const auto numberOfBlocks = repeatingBlocksDataSize / m_repeatingBlockLength;
|
||||||
|
const auto repeatingBlocksOffset = m_fixedBlockLength + headerLength;
|
||||||
|
for (int i = 0; i < numberOfBlocks; ++i) {
|
||||||
|
const auto blockStartRegister = static_cast<quint16>(modbusStartRegister() + repeatingBlocksOffset + m_repeatingBlockLength * i);
|
||||||
|
const auto block = new SunSpecMpptModelRepeatingBlock(i, m_repeatingBlockLength, blockStartRegister, this);
|
||||||
|
m_repeatingBlocks.append(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, SunSpecMpptModel *model)
|
QDebug operator<<(QDebug debug, SunSpecMpptModel *model)
|
||||||
{
|
{
|
||||||
debug.nospace().noquote() << "SunSpecMpptModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
debug.nospace().noquote() << "SunSpecMpptModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
@ -86,7 +86,7 @@ public:
|
|||||||
Q_DECLARE_FLAGS(DcevtFlags, Dcevt)
|
Q_DECLARE_FLAGS(DcevtFlags, Dcevt)
|
||||||
Q_FLAG(Dcevt)
|
Q_FLAG(Dcevt)
|
||||||
|
|
||||||
explicit SunSpecMpptModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecMpptModel *parent = nullptr);
|
explicit SunSpecMpptModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecMpptModel *parent);
|
||||||
~SunSpecMpptModelRepeatingBlock() override = default;
|
~SunSpecMpptModelRepeatingBlock() override = default;
|
||||||
|
|
||||||
SunSpecMpptModel *parentModel() const;
|
SunSpecMpptModel *parentModel() const;
|
||||||
@ -113,7 +113,7 @@ public:
|
|||||||
/* Module Events */
|
/* Module Events */
|
||||||
DcevtFlags moduleEvents() const;
|
DcevtFlags moduleEvents() const;
|
||||||
|
|
||||||
void processBlockData(const QVector<quint16> blockData) override;
|
void processBlockData() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initDataPoints() override;
|
void initDataPoints() override;
|
||||||
@ -199,6 +199,9 @@ protected:
|
|||||||
void processBlockData() override;
|
void processBlockData() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void setupRepeatingBlocks();
|
||||||
|
|
||||||
qint16 m_currentScaleFactor = 0;
|
qint16 m_currentScaleFactor = 0;
|
||||||
qint16 m_voltageScaleFactor = 0;
|
qint16 m_voltageScaleFactor = 0;
|
||||||
qint16 m_powerScaleFactor = 0;
|
qint16 m_powerScaleFactor = 0;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
*
|
*
|
||||||
* Copyright 2013 - 2021, nymea GmbH
|
* Copyright 2013 - 2025, nymea GmbH
|
||||||
* Contact: contact@nymea.io
|
* Contact: contact@nymea.io
|
||||||
*
|
*
|
||||||
* This fileDescriptor is part of nymea.
|
* This fileDescriptor is part of nymea.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user