From f22aae499db8eb7b31ecd73ff6c83ddb1fe25cdf Mon Sep 17 00:00:00 2001 From: trabus322 Date: Mon, 18 Mar 2024 13:44:25 +0100 Subject: [PATCH] Revert "Trying to make less calls to dtu, making it "multithreaded"" This reverts commit ad4ff13be0f2bb477f698c0143d68c71f94cb392. --- inc/hoymiles/port.h | 3 --- inc/hoymiles/portParameters/portParameters.h | 4 ++-- .../portParameters/portParametersGeneric.h | 8 +++---- src/hoymiles/microinverter.cpp | 2 -- src/hoymiles/port.cpp | 21 ++++++------------- .../portParameters/portParameters.cpp | 13 ++++++------ .../portParameters/portParametersGeneric.cpp | 20 ++++++++++++------ 7 files changed, 33 insertions(+), 38 deletions(-) diff --git a/inc/hoymiles/port.h b/inc/hoymiles/port.h index 9071fdc..cd7cb79 100644 --- a/inc/hoymiles/port.h +++ b/inc/hoymiles/port.h @@ -19,9 +19,6 @@ class Port { uint16_t portStartAddress; - uint16_t *readArray; - int readArraySize; - std::vector> parameters; void populateParameters(); diff --git a/inc/hoymiles/portParameters/portParameters.h b/inc/hoymiles/portParameters/portParameters.h index 1444f29..83dcd85 100644 --- a/inc/hoymiles/portParameters/portParameters.h +++ b/inc/hoymiles/portParameters/portParameters.h @@ -5,7 +5,7 @@ class PortParameterMicroinverterSerialNumber : public PortParameterInt { protected: - void setValueFromRegisters(uint16_t *readArray, int readArraySize); + void setValueFromRegisters(uint16_t *readArray, int registerCount); public: PortParameterMicroinverterSerialNumber(); @@ -13,7 +13,7 @@ class PortParameterMicroinverterSerialNumber : public PortParameterInt { class PortParameterPortNumber : public PortParameterInt { private: - void setValueFromRegisters(uint16_t *readArray, int readArraySize); + void setValueFromRegisters(uint16_t *readArray, int registerCount); public: PortParameterPortNumber(); diff --git a/inc/hoymiles/portParameters/portParametersGeneric.h b/inc/hoymiles/portParameters/portParametersGeneric.h index bc59063..b9578bd 100644 --- a/inc/hoymiles/portParameters/portParametersGeneric.h +++ b/inc/hoymiles/portParameters/portParametersGeneric.h @@ -14,7 +14,7 @@ class PortParameter { uint16_t parameterAddressOffset; int registerSize; - virtual void setValueFromRegisters(uint16_t *readArray, int readArraySize); + virtual void setValueFromRegisters(uint16_t *readArray, int registerCount); public: PortParameter(std::string name, uint16_t parameterAddressOffset, int registerSize); @@ -40,14 +40,14 @@ class PortParameter { virtual std::string getOutputValue(); - void updateValue(uint16_t *readArray, int readArraySize, int registerCount); + void updateValue(std::shared_ptr modbus_context, std::mutex *modbus_context_mutex, uint16_t portStartAddress); }; class PortParameterFloat : virtual public PortParameter { protected: int decimalPlaces; - virtual void setValueFromRegisters(uint16_t *readArray, int readArraySize); + virtual void setValueFromRegisters(uint16_t *readArray, int registerCount); public: PortParameterFloat(std::string name, int decimalPlaces, uint16_t parameterAddressOffset, int registerSize); @@ -57,7 +57,7 @@ class PortParameterFloat : virtual public PortParameter { class PortParameterInt : virtual public PortParameter { protected: - virtual void setValueFromRegisters(uint16_t *readArray, int readArraySize); + virtual void setValueFromRegisters(uint16_t *readArray, int registerCount); public: PortParameterInt(std::string name, uint16_t parameterAddressOffset, int registerSize); diff --git a/src/hoymiles/microinverter.cpp b/src/hoymiles/microinverter.cpp index cdc06c1..6a636ed 100644 --- a/src/hoymiles/microinverter.cpp +++ b/src/hoymiles/microinverter.cpp @@ -29,8 +29,6 @@ void Microinverter::populatePorts() { this->modbus_context_mutex->lock(); registerCount = modbus_read_registers(*this->modbus_context.get(), portStartAddress + 0x0021, 1, readArray); this->modbus_context_mutex->unlock(); - - break; } } diff --git a/src/hoymiles/port.cpp b/src/hoymiles/port.cpp index 067d397..d12e634 100644 --- a/src/hoymiles/port.cpp +++ b/src/hoymiles/port.cpp @@ -1,21 +1,18 @@ -#include -#include -#include -#include #include +#include +#include +#include +#include #include "modbus.h" #include "port.h" #include "portParameters.h" -Port::Port(std::shared_ptr modbus_context, std::mutex *modbus_context_mutex, uint16_t portStartAddress) { +Port::Port(std::shared_ptr modbus_context, std::mutex *modbus_context_mutex, uint16_t portStartAddress) { this->modbus_context = modbus_context; this->modbus_context_mutex = modbus_context_mutex; - this->readArraySize = 34; - this->readArray = new uint16_t[this->readArraySize]; - this->portStartAddress = portStartAddress; this->populateParameters(); @@ -54,15 +51,9 @@ void Port::populateParameters() { } void Port::updateParameters() { - int registerCount; - - modbus_context_mutex->lock(); - registerCount = modbus_read_registers(*modbus_context.get(), portStartAddress - 1, this->readArraySize, this->readArray); - modbus_context_mutex->unlock(); - std::vector>::iterator parametersIterator{this->parameters.begin()}; while (parametersIterator != this->parameters.end()) { - parametersIterator->get()->updateValue(this->readArray, this->readArraySize, registerCount); + parametersIterator->get()->updateValue(this->modbus_context, this->modbus_context_mutex, this->portStartAddress); parametersIterator++; } } \ No newline at end of file diff --git a/src/hoymiles/portParameters/portParameters.cpp b/src/hoymiles/portParameters/portParameters.cpp index 4754d18..98f86e6 100644 --- a/src/hoymiles/portParameters/portParameters.cpp +++ b/src/hoymiles/portParameters/portParameters.cpp @@ -6,11 +6,12 @@ PortParameterMicroinverterSerialNumber::PortParameterMicroinverterSerialNumber() : PortParameterInt("microinverterSerialNumber", 0x0001, 6), PortParameter("microinverterSerialNumber", 0x0001, 6) {} -void PortParameterMicroinverterSerialNumber::setValueFromRegisters(uint16_t *readArray, int readArraySize) { +void PortParameterMicroinverterSerialNumber::setValueFromRegisters(uint16_t *readArray, int registerCount) { uint16_t readValue; std::string readValueString = ""; - for (int i{0}; i < std::ceil(this->registerSize/2) && (this->parameterAddressOffset + i) < readArraySize; i++) { - readValue = readArray[this->parameterAddressOffset + i]; + registerCount = std::ceil(registerCount/2); + for (int i{0}; i < registerCount; i++) { + readValue = readArray[i]; std::stringstream readValueStringStream; readValueStringStream << std::hex << readValue; readValueString.append(readValueStringStream.str()); @@ -20,9 +21,9 @@ void PortParameterMicroinverterSerialNumber::setValueFromRegisters(uint16_t *rea PortParameterPortNumber::PortParameterPortNumber() : PortParameterInt("portNumber", 0x0007, 1), PortParameter("portNumber", 0x0007, 1) {} -void PortParameterPortNumber::setValueFromRegisters(uint16_t *readArray, int readArraySize) { - if(readArraySize > this->parameterAddressOffset) { - this->value.i = readArray[this->parameterAddressOffset]; +void PortParameterPortNumber::setValueFromRegisters(uint16_t *readArray, int registerCount) { + if (registerCount > 0) { + this->value.i = readArray[0]; } } diff --git a/src/hoymiles/portParameters/portParametersGeneric.cpp b/src/hoymiles/portParameters/portParametersGeneric.cpp index 4fc11f4..000da08 100644 --- a/src/hoymiles/portParameters/portParametersGeneric.cpp +++ b/src/hoymiles/portParameters/portParametersGeneric.cpp @@ -20,7 +20,7 @@ PortParameter::PortParameter(std::string name, uint16_t parameterAddressOffset, PortParameter::~PortParameter() {} -void PortParameter::setValueFromRegisters(uint16_t *readArray, int readArraySize) {} +void PortParameter::setValueFromRegisters(uint16_t *readArray, int registerCount) {} std::pair PortParameter::getValue() { return std::pair(this->value, this->valueType); @@ -28,7 +28,14 @@ std::pair modbus_context, std::mutex *modbus_context_mutex, uint16_t portStartAddress) { + uint16_t readArray[this->registerSize]; + int registerCount; + + modbus_context_mutex->lock(); + registerCount = modbus_read_registers(*modbus_context.get(), portStartAddress + this->parameterAddressOffset, this->registerSize, readArray); + modbus_context_mutex->unlock(); + if(registerCount == -1){ this->age++; } @@ -46,7 +53,7 @@ PortParameterFloat::PortParameterFloat(std::string name, int decimalPlaces, uint this->value.f = 0; } -void PortParameterFloat::setValueFromRegisters(uint16_t *readArray, int readArraySize) { +void PortParameterFloat::setValueFromRegisters(uint16_t *readArray, int registerCount) { float temp = readArray[0]; temp = temp / std::pow(10, this->decimalPlaces); this->value.f = temp; @@ -62,11 +69,12 @@ PortParameterInt::PortParameterInt(std::string name, uint16_t parameterAddressOf this->value.i = 0; } -void PortParameterInt::setValueFromRegisters(uint16_t *readArray, int readArraySize) { +void PortParameterInt::setValueFromRegisters(uint16_t *readArray, int registerCount) { uint16_t readValue; std::string readValueString = ""; - for (int i{0}; i < std::ceil(this->registerSize/2) && (this->parameterAddressOffset + i) < readArraySize; i++) { - readValue = readArray[this->parameterAddressOffset + i]; + registerCount = std::ceil(registerCount/2); + for (int i{0}; i < registerCount; i++) { + readValue = readArray[i]; readValueString.append(std::to_string(readValue)); } this->value.i = std::stol(readValueString);