#ifndef HOYMILES_H #define HOYMILES_H #include #include #include #include struct _modbus; typedef _modbus modbus_t; class PortParameter { protected: uint16_t addressOffset; int registerSize; virtual void setValue(uint16_t *readArray, int registerCount); public: PortParameter(std::string name, uint16_t addressOffset, int registerSize); std::string name; int age; virtual void updateValue(modbus_t *modbus_context, uint16_t portStartAddress); }; 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); public: PortParameterSerialNumber(); }; class PortParameterFloat : public PortParameterTemplate { private: int decimalPlaces; void setValue(uint16_t *readArray, int registerCount); public: PortParameterFloat(std::string name, uint16_t addressOffset, int registerSize, int decimalPlaces); float value; }; class Port { private: modbus_t *modbus_context; uint16_t portStartAddress; std::vector> parameters; void populateParameters(); public: 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; std::vector ports; void populatePorts(); public: Microinverter(modbus_t *modbus_t); void updatePorts(); void updatePort(int i); Port getPort(int i); }; class Dtu { private: modbus_t *modbus_context; std::vector microinverters; void populateMicroinverters(); public: Dtu(const char *ip_address, int port); void updateMicroinverters(); ~Dtu(); }; #endif