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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecFlowBatteryModelRepeatingBlock::SunSpecFlowBatteryModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("BatStTBD").isValid())
|
||||
m_batteryStringPointsToBeDetermined = m_dataPoints.value("BatStTBD").toUInt16();
|
||||
@ -86,6 +85,8 @@ SunSpecFlowBatteryModel::SunSpecFlowBatteryModel(SunSpecConnection *connection,
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecFlowBatteryModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecFlowBatteryModel::~SunSpecFlowBatteryModel()
|
||||
@ -159,6 +160,34 @@ void SunSpecFlowBatteryModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -44,7 +44,7 @@ class SunSpecFlowBatteryModelRepeatingBlock : public SunSpecModelRepeatingBlock
|
||||
Q_OBJECT
|
||||
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;
|
||||
|
||||
SunSpecFlowBatteryModel *parentModel() const;
|
||||
@ -53,7 +53,7 @@ public:
|
||||
/* Battery String Points To Be Determined */
|
||||
quint16 batteryStringPointsToBeDetermined() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -90,6 +90,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_batteryPointsToBeDetermined = 0;
|
||||
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecFlowBatteryModuleModelRepeatingBlock::SunSpecFlowBatteryModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryModuleModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("StackTBD").isValid())
|
||||
m_stackPointsToBeDetermined = m_dataPoints.value("StackTBD").toUInt16();
|
||||
@ -86,6 +85,8 @@ SunSpecFlowBatteryModuleModel::SunSpecFlowBatteryModuleModel(SunSpecConnection *
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecFlowBatteryModuleModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecFlowBatteryModuleModel::~SunSpecFlowBatteryModuleModel()
|
||||
@ -159,6 +160,34 @@ void SunSpecFlowBatteryModuleModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -44,7 +44,7 @@ class SunSpecFlowBatteryModuleModelRepeatingBlock : public SunSpecModelRepeating
|
||||
Q_OBJECT
|
||||
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;
|
||||
|
||||
SunSpecFlowBatteryModuleModel *parentModel() const;
|
||||
@ -53,7 +53,7 @@ public:
|
||||
/* Stack Points To Be Determined */
|
||||
quint16 stackPointsToBeDetermined() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -90,6 +90,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_modulePointsToBeDetermined = 0;
|
||||
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecFlowBatteryStackModelRepeatingBlock::SunSpecFlowBatteryStackModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStackModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("CellTBD").isValid())
|
||||
m_cellPointsToBeDetermined = m_dataPoints.value("CellTBD").toUInt16();
|
||||
@ -86,6 +85,8 @@ SunSpecFlowBatteryStackModel::SunSpecFlowBatteryStackModel(SunSpecConnection *co
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecFlowBatteryStackModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecFlowBatteryStackModel::~SunSpecFlowBatteryStackModel()
|
||||
@ -159,6 +160,34 @@ void SunSpecFlowBatteryStackModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -44,7 +44,7 @@ class SunSpecFlowBatteryStackModelRepeatingBlock : public SunSpecModelRepeatingB
|
||||
Q_OBJECT
|
||||
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;
|
||||
|
||||
SunSpecFlowBatteryStackModel *parentModel() const;
|
||||
@ -53,7 +53,7 @@ public:
|
||||
/* Cell Points To Be Determined */
|
||||
quint16 cellPointsToBeDetermined() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -90,6 +90,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_stackPointsToBeDetermined = 0;
|
||||
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecFlowBatteryStringModelRepeatingBlock::SunSpecFlowBatteryStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFlowBatteryStringModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ModIdx").isValid())
|
||||
m_moduleIndex = m_dataPoints.value("ModIdx").toUInt16();
|
||||
@ -473,6 +472,8 @@ SunSpecFlowBatteryStringModel::SunSpecFlowBatteryStringModel(SunSpecConnection *
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecFlowBatteryStringModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecFlowBatteryStringModel::~SunSpecFlowBatteryStringModel()
|
||||
@ -1116,6 +1117,34 @@ void SunSpecFlowBatteryStringModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -167,7 +167,7 @@ public:
|
||||
Q_DECLARE_FLAGS(Modevt2Flags, 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;
|
||||
|
||||
SunSpecFlowBatteryStringModel *parentModel() const;
|
||||
@ -219,7 +219,7 @@ public:
|
||||
/* Reason why the module is currently disabled. */
|
||||
Moddisrsn disabledReason() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -378,6 +378,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_stringIndex = 0;
|
||||
quint16 m_moduleCount = 0;
|
||||
quint16 m_connectedModuleCount = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecFreqWattModelRepeatingBlock::SunSpecFreqWattModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecFreqWattModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1733,6 +1732,8 @@ SunSpecFreqWattModel::SunSpecFreqWattModel(SunSpecConnection *connection, quint1
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecFreqWattModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecFreqWattModel::~SunSpecFreqWattModel()
|
||||
@ -2066,6 +2067,34 @@ void SunSpecFreqWattModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecFreqWattModel *parentModel() const;
|
||||
@ -260,7 +260,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -382,6 +382,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecHfrtcModelRepeatingBlock::SunSpecHfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtcModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecHfrtcModel::SunSpecHfrtcModel(SunSpecConnection *connection, quint16 modb
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecHfrtcModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecHfrtcModel::~SunSpecHfrtcModel()
|
||||
@ -1796,6 +1797,34 @@ void SunSpecHfrtcModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecHfrtcModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -341,6 +341,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecHfrtModelRepeatingBlock::SunSpecHfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecHfrtModel::SunSpecHfrtModel(SunSpecConnection *connection, quint16 modbus
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecHfrtModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecHfrtModel::~SunSpecHfrtModel()
|
||||
@ -1796,6 +1797,34 @@ void SunSpecHfrtModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecHfrtModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -341,6 +341,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecHfrtxModelRepeatingBlock::SunSpecHfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHfrtxModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecHfrtxModel::SunSpecHfrtxModel(SunSpecConnection *connection, quint16 modb
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecHfrtxModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecHfrtxModel::~SunSpecHfrtxModel()
|
||||
@ -1797,6 +1798,34 @@ void SunSpecHfrtxModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecHfrtxModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -346,6 +346,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecHvrtcModelRepeatingBlock::SunSpecHvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtcModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecHvrtcModel::SunSpecHvrtcModel(SunSpecConnection *connection, quint16 modb
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecHvrtcModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecHvrtcModel::~SunSpecHvrtcModel()
|
||||
@ -1796,6 +1797,34 @@ void SunSpecHvrtcModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecHvrtcModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -341,6 +341,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecHvrtModelRepeatingBlock::SunSpecHvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecHvrtModel::SunSpecHvrtModel(SunSpecConnection *connection, quint16 modbus
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecHvrtModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecHvrtModel::~SunSpecHvrtModel()
|
||||
@ -1796,6 +1797,34 @@ void SunSpecHvrtModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecHvrtModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -341,6 +341,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecHvrtxModelRepeatingBlock::SunSpecHvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecHvrtxModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecHvrtxModel::SunSpecHvrtxModel(SunSpecConnection *connection, quint16 modb
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecHvrtxModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecHvrtxModel::~SunSpecHvrtxModel()
|
||||
@ -1797,6 +1798,34 @@ void SunSpecHvrtxModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecHvrtxModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -346,6 +346,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecIrradianceModelRepeatingBlock::SunSpecIrradianceModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecIrradianceModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("GHI").isValid())
|
||||
m_ghi = m_dataPoints.value("GHI").toUInt16();
|
||||
@ -162,6 +161,8 @@ SunSpecIrradianceModel::SunSpecIrradianceModel(SunSpecConnection *connection, qu
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecIrradianceModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecIrradianceModel::~SunSpecIrradianceModel()
|
||||
@ -217,6 +218,34 @@ void SunSpecIrradianceModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -44,7 +44,7 @@ class SunSpecIrradianceModelRepeatingBlock : public SunSpecModelRepeatingBlock
|
||||
Q_OBJECT
|
||||
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;
|
||||
|
||||
SunSpecIrradianceModel *parentModel() const;
|
||||
@ -61,7 +61,7 @@ public:
|
||||
/* Other Irradiance [W/m2] */
|
||||
quint16 oti() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -101,6 +101,9 @@ protected:
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecLfrtcModelRepeatingBlock::SunSpecLfrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtcModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecLfrtcModel::SunSpecLfrtcModel(SunSpecConnection *connection, quint16 modb
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecLfrtcModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecLfrtcModel::~SunSpecLfrtcModel()
|
||||
@ -1796,6 +1797,34 @@ void SunSpecLfrtcModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecLfrtcModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -341,6 +341,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecLfrtModelRepeatingBlock::SunSpecLfrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecLfrtModel::SunSpecLfrtModel(SunSpecConnection *connection, quint16 modbus
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecLfrtModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecLfrtModel::~SunSpecLfrtModel()
|
||||
@ -1796,6 +1797,34 @@ void SunSpecLfrtModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecLfrtModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -341,6 +341,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecLfrtxModelRepeatingBlock::SunSpecLfrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLfrtxModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecLfrtxModel::SunSpecLfrtxModel(SunSpecConnection *connection, quint16 modb
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecLfrtxModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecLfrtxModel::~SunSpecLfrtxModel()
|
||||
@ -1797,6 +1798,34 @@ void SunSpecLfrtxModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecLfrtxModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -346,6 +346,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecLithiumIonBankModelRepeatingBlock::SunSpecLithiumIonBankModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonBankModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("StrNMod").isValid())
|
||||
m_moduleCount = m_dataPoints.value("StrNMod").toUInt16();
|
||||
@ -591,6 +590,8 @@ SunSpecLithiumIonBankModel::SunSpecLithiumIonBankModel(SunSpecConnection *connec
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecLithiumIonBankModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecLithiumIonBankModel::~SunSpecLithiumIonBankModel()
|
||||
@ -1151,6 +1152,34 @@ void SunSpecLithiumIonBankModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -156,7 +156,7 @@ public:
|
||||
Q_DECLARE_FLAGS(Strevt1Flags, 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;
|
||||
|
||||
SunSpecLithiumIonBankModel *parentModel() const;
|
||||
@ -220,7 +220,7 @@ public:
|
||||
/* Pad register. */
|
||||
quint16 pad2() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -332,6 +332,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_stringCount = 0;
|
||||
quint16 m_connectedStringCount = 0;
|
||||
float m_maxModuleTemperature = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecLithiumIonModuleModelRepeatingBlock::SunSpecLithiumIonModuleModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonModuleModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("CellV").isValid())
|
||||
m_cellVoltage = m_dataPoints.value("CellV").toFloatWithSSF(m_parentModel->cellV_SF());
|
||||
@ -127,6 +126,8 @@ SunSpecLithiumIonModuleModel::SunSpecLithiumIonModuleModel(SunSpecConnection *co
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecLithiumIonModuleModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecLithiumIonModuleModel::~SunSpecLithiumIonModuleModel()
|
||||
@ -697,6 +698,34 @@ void SunSpecLithiumIonModuleModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
Q_DECLARE_FLAGS(CellstFlags, 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;
|
||||
|
||||
SunSpecLithiumIonModuleModel *parentModel() const;
|
||||
@ -63,7 +63,7 @@ public:
|
||||
/* Status of the cell. */
|
||||
CellstFlags cellStatus() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -152,6 +152,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_stringIndex = 0;
|
||||
quint16 m_moduleIndex = 0;
|
||||
quint16 m_moduleCellCount = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecLithiumIonStringModelRepeatingBlock::SunSpecLithiumIonStringModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLithiumIonStringModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ModNCell").isValid())
|
||||
m_moduleCellCount = m_dataPoints.value("ModNCell").toUInt16();
|
||||
@ -383,6 +382,8 @@ SunSpecLithiumIonStringModel::SunSpecLithiumIonStringModel(SunSpecConnection *co
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecLithiumIonStringModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecLithiumIonStringModel::~SunSpecLithiumIonStringModel()
|
||||
@ -1229,6 +1230,34 @@ void SunSpecLithiumIonStringModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -44,7 +44,7 @@ class SunSpecLithiumIonStringModelRepeatingBlock : public SunSpecModelRepeatingB
|
||||
Q_OBJECT
|
||||
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;
|
||||
|
||||
SunSpecLithiumIonStringModel *parentModel() const;
|
||||
@ -83,7 +83,7 @@ public:
|
||||
/* Pad register. */
|
||||
quint16 pad7() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -313,6 +313,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_stringIndex = 0;
|
||||
quint16 m_moduleCount = 0;
|
||||
StFlags m_stringStatus;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecLvrtcModelRepeatingBlock::SunSpecLvrtcModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtcModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecLvrtcModel::SunSpecLvrtcModel(SunSpecConnection *connection, quint16 modb
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecLvrtcModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecLvrtcModel::~SunSpecLvrtcModel()
|
||||
@ -1796,6 +1797,34 @@ void SunSpecLvrtcModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecLvrtcModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -341,6 +341,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecLvrtModelRepeatingBlock::SunSpecLvrtModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecLvrtModel::SunSpecLvrtModel(SunSpecConnection *connection, quint16 modbus
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecLvrtModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecLvrtModel::~SunSpecLvrtModel()
|
||||
@ -1796,6 +1797,34 @@ void SunSpecLvrtModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecLvrtModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -341,6 +341,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecLvrtxModelRepeatingBlock::SunSpecLvrtxModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecLvrtxModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ActPt").isValid())
|
||||
m_actPt = m_dataPoints.value("ActPt").toUInt16();
|
||||
@ -1471,6 +1470,8 @@ SunSpecLvrtxModel::SunSpecLvrtxModel(SunSpecConnection *connection, quint16 modb
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecLvrtxModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecLvrtxModel::~SunSpecLvrtxModel()
|
||||
@ -1797,6 +1798,34 @@ void SunSpecLvrtxModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -50,7 +50,7 @@ public:
|
||||
};
|
||||
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;
|
||||
|
||||
SunSpecLvrtxModel *parentModel() const;
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/* Enumerated value indicates if curve is read-only or can be modified. */
|
||||
Readonly readOnly() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -346,6 +346,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
quint16 m_actCrv = 0;
|
||||
ModenaFlags m_modEna;
|
||||
quint16 m_winTms = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -34,6 +34,7 @@
|
||||
SunSpecMpptModelRepeatingBlock::SunSpecMpptModelRepeatingBlock(quint16 blockIndex, quint16 blockSize, quint16 modbusStartRegister, SunSpecMpptModel *parent) :
|
||||
SunSpecModelRepeatingBlock(blockIndex, blockSize, modbusStartRegister, parent)
|
||||
{
|
||||
m_parentModel = parent;
|
||||
m_byteOrder = parent->byteOrder();
|
||||
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
|
||||
if (m_dataPoints.value("ID").isValid())
|
||||
m_inputId = m_dataPoints.value("ID").toUInt16();
|
||||
@ -247,6 +246,8 @@ SunSpecMpptModel::SunSpecMpptModel(SunSpecConnection *connection, quint16 modbus
|
||||
m_modelBlockType = SunSpecModel::ModelBlockTypeFixedAndRepeating;
|
||||
|
||||
initDataPoints();
|
||||
|
||||
connect(this, &SunSpecModel::initFinished, this, &SunSpecMpptModel::setupRepeatingBlocks);
|
||||
}
|
||||
|
||||
SunSpecMpptModel::~SunSpecMpptModel()
|
||||
@ -435,6 +436,34 @@ void SunSpecMpptModel::processBlockData()
|
||||
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)
|
||||
{
|
||||
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
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
@ -86,7 +86,7 @@ public:
|
||||
Q_DECLARE_FLAGS(DcevtFlags, 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;
|
||||
|
||||
SunSpecMpptModel *parentModel() const;
|
||||
@ -113,7 +113,7 @@ public:
|
||||
/* Module Events */
|
||||
DcevtFlags moduleEvents() const;
|
||||
|
||||
void processBlockData(const QVector<quint16> blockData) override;
|
||||
void processBlockData() override;
|
||||
|
||||
protected:
|
||||
void initDataPoints() override;
|
||||
@ -199,6 +199,9 @@ protected:
|
||||
void processBlockData() override;
|
||||
|
||||
private:
|
||||
|
||||
void setupRepeatingBlocks();
|
||||
|
||||
qint16 m_currentScaleFactor = 0;
|
||||
qint16 m_voltageScaleFactor = 0;
|
||||
qint16 m_powerScaleFactor = 0;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* This fileDescriptor is part of nymea.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
*
|
||||
* Copyright 2013 - 2021, nymea GmbH
|
||||
* Copyright 2013 - 2025, nymea GmbH
|
||||
* Contact: contact@nymea.io
|
||||
*
|
||||
* 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