#ifndef ACUVIM_READER_H #define ACUVIM_READER_H #include #include #include "acuvim_registers.h" #include "pin_config.h" class AcuvimReader { public: bool begin(uint8_t slaveAddress = MODBUS_SLAVE_ADDR_DEFAULT, uint32_t baudRate = RS485_BAUD_DEFAULT); bool readAll(AcuvimData& data); bool readMetering(AcuvimData& data); bool readEnergy(AcuvimData& data); bool readDemand(AcuvimData& data); bool readTHD(AcuvimData& data); uint32_t getSuccessCount() const { return _successCount; } uint32_t getErrorCount() const { return _errorCount; } uint8_t getLastError() const { return _lastError; } uint32_t getLastReadDurationMs() const { return _lastReadDurationMs; } uint32_t getConsecutiveErrors() const { return _consecutiveErrors; } private: ModbusMaster _modbus; uint8_t _slaveAddr; uint32_t _successCount; uint32_t _errorCount; uint8_t _lastError; uint32_t _lastReadDurationMs; uint32_t _consecutiveErrors; float parseFloat32(uint16_t hiReg, uint16_t loReg); uint8_t readRegistersWithRetry(uint16_t startReg, uint16_t count); static void preTransmission(); static void postTransmission(); }; #endif