#ifndef ADC_ADS1220_H
#define ADC_ADS1220_H

#include <Arduino.h>
#include <SPI.h>
#include <stdint.h>
#include <Wire.h>
#include "mux_tca9555.h"
#include "deviceConfig.h"


// ADC Constants
constexpr float PGA = 1;
constexpr float VREF = 2.048f;
constexpr int32_t FSR = (1 << 23) - 1;
constexpr float VFSR = VREF / PGA;
constexpr float ADC_SCALE = (VFSR * 1000.0f) / FSR;

extern SPIClass hspi;
// extern TCA9555 TCA;


// Optimized sensor data structure
struct SensorData {
  uint32_t serial;
  time_t timestamp;
  float temperature;
  float dc_voltage;
  float ac_voltage;
  float dc_current;
  float ac_current;
};


// Function declarations
void setupADC(void);
void acquireMeasurements(SensorData& data);
int sensorAcquisitionTime(void);
int32_t getInternalOffset();
// Channel Setup functions
void enableDCVoltage();
void enableDCCurrent();
void enableACVoltage();
void enableACCurrent();
// Measurement functions
float measureDCVoltage();
float measureDCCurrent();
float measureACVoltage();
float measureACCurrent();

// Internal functions
void startConversion(void);
int32_t readADCSample(void);
float calibratedLinear(float raw_value, float a1, float a0);
float calibratedQuadratic(float raw_value, float a2, float a1, float a0);
float calibratedCubic(float raw_value, float a3, float a2, float a1, float a0);
void enableDataReadyInterrupt(void);
void flushSettlingSamples(uint8_t count);

// Interrupt handler
void IRAM_ATTR dataReadyISR();

#endif