diff --git a/inc/hoymiles.h b/inc/hoymiles.h index 6fd10df..bf7d1d4 100644 --- a/inc/hoymiles.h +++ b/inc/hoymiles.h @@ -10,24 +10,45 @@ struct _modbus; typedef _modbus modbus_t; class PortParameter { - protected: + protected: uint16_t addressOffset; - int registerSize; - void setValue(uint16_t *readArray, int registerCount); + virtual void setValue(uint16_t *readArray, int registerCount); - public: + public: PortParameter(std::string name, uint16_t addressOffset, int registerSize); std::string name; + int age; - int value; virtual void updateValue(modbus_t *modbus_context, uint16_t portStartAddress); }; -class PortParameterSerialNumber : public PortParameter { + + +template +class PortParameterTemplate : virtual public PortParameter { + public: + PortParameterTemplate(std::string name, uint16_t addressOffset, int registerSize); + + Type value; + + Type getValue(); +}; + +class PortParameterInt : public PortParameterTemplate { + private: + void setValue(uint16_t *readArray, int registerCount); + + public: + PortParameterInt(); +}; + + + +class PortParameterSerialNumber : public PortParameterTemplate { private: void setValue(uint16_t *readArray, int registerCount); @@ -35,7 +56,9 @@ class PortParameterSerialNumber : public PortParameter { PortParameterSerialNumber(); }; -class PortParameterFloat : public PortParameter { + + +class PortParameterFloat : public PortParameterTemplate { private: int decimalPlaces; @@ -47,6 +70,8 @@ class PortParameterFloat : public PortParameter { float value; }; + + class Port { private: modbus_t *modbus_context; @@ -60,8 +85,14 @@ class Port { Port(modbus_t *modbus_context, uint16_t portStartAddress); void updateParameters(); + + std::shared_ptr getParameterById(int i); + + std::shared_ptr getParameterByName(std::string name); }; + + class Microinverter { private: modbus_t *modbus_context; @@ -80,6 +111,8 @@ class Microinverter { Port getPort(int i); }; + + class Dtu { private: modbus_t *modbus_context; diff --git a/src/hoymiles.cpp b/src/hoymiles.cpp index 56bf5b9..c544790 100644 --- a/src/hoymiles.cpp +++ b/src/hoymiles.cpp @@ -3,6 +3,7 @@ #include #include +#include Dtu::Dtu(const char *ip_address, int port) { this->modbus_context = modbus_new_tcp(ip_address, port); @@ -34,33 +35,7 @@ void Dtu::updateMicroinverters() { } } -void PortParameter::setValue(uint16_t *readArray, int registerCount) { - this->value = readArray[0]; -} -PortParameter::PortParameter(std::string name, uint16_t addressOffset, int registerSize) { - this->name = name; - - this->addressOffset = addressOffset; - this->registerSize = registerSize; - - this->value = 0; -} - -void PortParameter::updateValue(modbus_t *modbus_context, uint16_t microinverterAddress) { - uint16_t readArray[this->registerSize]; - int registerCount; - registerCount = modbus_read_registers(modbus_context, microinverterAddress + this->addressOffset, this->registerSize, readArray); - registerCount = 2; - readArray[0] = 2309; - readArray[1] = 4354; - if (registerCount == -1) { - this->age++; - } else { - this->setValue(readArray, registerCount); - this->age = 0; - } -} void Microinverter::populatePorts() { Port port{this->modbus_context, 0x1000}; @@ -80,10 +55,21 @@ Microinverter::Microinverter(modbus_t *modbus_context) { this->populatePorts(); } -void Port::populateParameters() { - PortParameterFloat portParameter{"gridVoltage", 0x0034, 2, 1}; - this->parameters.push_back(std::make_shared(portParameter)); + +Port::Port(modbus_t *modbus_context, uint16_t portStartAddress) { + this->modbus_context = modbus_context; + this->portStartAddress = portStartAddress; + + this->populateParameters(); +} + +void Port::populateParameters() { + PortParameterFloat portParameterFloat{"gridVoltage", 0x0034, 2, 1}; + this->parameters.push_back(std::make_shared(portParameterFloat)); + + PortParameterSerialNumber portParameterSerialNumber{}; + this->parameters.push_back(std::make_shared(portParameterSerialNumber)); } void Port::updateParameters() { @@ -94,14 +80,44 @@ void Port::updateParameters() { } } -Port::Port(modbus_t *modbus_context, uint16_t portStartAddress) { - this->modbus_context = modbus_context; - this->portStartAddress = portStartAddress; - - this->populateParameters(); +std::shared_ptr Port::getParameterById(int i) { + return this->parameters.at(i); } -PortParameterFloat::PortParameterFloat(std::string name, uint16_t addressOffset, int registerSize, int decimalPlaces) : PortParameter(name, addressOffset, registerSize) { + + +PortParameter::PortParameter(std::string name, uint16_t addressOffset, int registerSize) { + this->name = name; + + this->addressOffset = addressOffset; + this->registerSize = registerSize; +} + +void PortParameter::updateValue(modbus_t *modbus_context, uint16_t microinverterAddress) { + uint16_t readArray[this->registerSize]; + int registerCount; + registerCount = modbus_read_registers(modbus_context, microinverterAddress + this->addressOffset, this->registerSize, readArray); + registerCount = 2; + readArray[0] = 2309; + readArray[1] = 4354; + if (registerCount == -1) { + this->age++; + } else { + this->setValue(readArray, registerCount); + this->age = 0; + } +} + +void PortParameter::setValue(uint16_t *readArray, int registerCount) {} + + + +template +PortParameterTemplate::PortParameterTemplate(std::string name, uint16_t addressOffset, int registerSize) : PortParameter(name, addressOffset, registerSize) {} + + + +PortParameterFloat::PortParameterFloat(std::string name, uint16_t addressOffset, int registerSize, int decimalPlaces) : PortParameterTemplate(name, addressOffset, registerSize), PortParameter(name, addressOffset, registerSize) { this->decimalPlaces = decimalPlaces; this->value = 0; } @@ -112,7 +128,14 @@ void PortParameterFloat::setValue(uint16_t *readArray, int registerCount) { this->value = readValue / std::pow(10, this->decimalPlaces); } -PortParameterSerialNumber::PortParameterSerialNumber() : PortParameter("serialNumber", 0x0001, 6){}; +template +Type PortParameterTemplate::getValue() { + return this->value; +} + + + +PortParameterSerialNumber::PortParameterSerialNumber() : PortParameterTemplate("serialNumber", 0x0001, 6), PortParameter("serialNumber", 0x0001, 6) {}; void PortParameterSerialNumber::setValue(uint16_t *readArray, int registerCount) { uint16_t readValue; diff --git a/src/main.cpp b/src/main.cpp index d112b9b..77d7c10 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,5 +21,7 @@ int main(){ hoymilesPort.updateParameters(); + std::shared_ptr temp{hoymilesPort.getParameterById(0)}; + float temp2 = temp.get()->getValue(); return 0; } \ No newline at end of file