/******************************************************************************
*
* @file    ads1260.h
* @author  ECS, Joseph Zimmer
* @version V1.0.0
* @date    25-04-2019
* @brief       
*
******************************************************************************/
#ifndef _ADS_1260_H
#define _ADS_1260_H

//--- INCLUDEs -----------------------------------------------------------------
#include "main.h"
#include "sysdata.h"
//--- GLOBALE TYPE DEFS --------------------------------------------------------       
typedef enum 
{
 ADC_STATE_INITIALIZE                 = 0, 
 ADC_STATE_CONVERSION_STOPPED         = 1,
 ADC_STATE_CONVERSION_RUNNING         = 2,
 ADC_STATE_READY_FOR_CONVERSION       = 3,
 ADC_STATE_SELF_OFFSET_CALIBRATION    = 4,
 ADC_STATE_SYSTEM_OFFSET_CALIBRATION  = 5,
 ADC_STATE_GAIN_CALIBRATION           = 6,
 ADC_STATE_ERROR                      = 7
}adc_state_enum_t;

typedef union
{
  uint32_t   w;
   int32_t  sw;
  uint16_t  hw[2];
   int16_t shw[2];
   uint8_t   s[4];
    int8_t  ss[4];
}convert_union_t;
//--- GLOBALE DEFINES ----------------------------------------------------------

//--- GLOBALE VARIABLEN PROTOTYPEN ---------------------------------------------
extern volatile uint32_t newCurrentValue;

//--- GLOBALE FUNKTIONS PROTOTYPEN ---------------------------------------------

/*
* @brief	
* @param	kein
* @retval	kein
*/
void ADS1260_init(void);

/*
* @brief	
* @param	kein
* @retval	kein
*/
void ADS1260_StartConversion(void);


/*
* @brief	
* @param	kein
* @retval	kein
*/
void ADS1260_ReadConversion(void);

/*
* @brief        set conversion state 
* @param	kein
* @retval	kein
*/
void ADS1260_ConversionFinished(void);



/*****************************************Softwarekalibrierung*************************************************/


/*
* @brief Gain Calibration
*        
* Diese Funktion dient zum kalibrieren der Verstärkung.
* Funktion sollte nach Offset Korrektur und Offset Commonmode Korrektur ausgeführt werden
* Für die Kalibrierung muss der Sensor in kalten Zustand gehalten werden, also zunächst Bypass zuschalten, Strom einstellen, warten bis Lasten stabil, dann bypass abschalten und unverzüglich kalibrierung starten
* @param	kein
* @retval	kein
*/
void ADS_1260_BatteryCurrentGainCalibrationStart(sys_data_t * data);


/*
* @brief Offset kalibrieren.
*        
* Nennspannung an Shunt 12V
* Messstrom abschalten, warten bis Sensor kalt und Mittelwertbildung stabil. Dann Starten
* @param	kein
* @retval	kein
*/
void ADS_1260_BatteryCurrentOffsetCalibrationStart(sys_data_t * data);


/*
* @brief Common Mode Error korrektur
*        
* Diese Funktion eliminiert den Common-Mode error.
* Die Spannung am Messwiderstand (also Batteriesspannung, wenn der Shunt in der positiven Leitung eingesetzt wird) ruft einen sogenannten Common Mode Fehler hervor.
* Die Busspannung wird zur Kaibrierung erhöht und damit der Fehler pro mV Busspannung berechnet
* @param	kein
* @retval	kein
*/
void ADS_1260_BatteryCurrentOffsetCommonModeErrorComepensationStart(sys_data_t * data);

/*
* @brief Calibrierung der Offset Temperaturdrift
*   
* Offset Kalibrierung und Commonmode Calibrierung muss bereits ausgeführt sein.     
* Diese Funktion bei erhöter Temperatur. Zum Beispiel 80°C ausführen
* Es darf kein Strom fließen.
* Berechnet Offset Drift mit Temperatur und speichert ein Kompensationswert
* @param	kein
* @retval	kein
*/
void ADS_1260_BatteryCurrentOffsetTemperatureErrorComepensationStart(void);

void ADS_1260_BatteryCurrentGainTemperatureCalibrationShuntStart(void);
/*
* @brief         
* @param	kein
* @retval	kein
*/
void ADS_1260_SetDigitalFilter(SPI_HandleTypeDef * hspi, uint8_t digitalFilter);
/*
* @brief         
* @param	kein
* @retval	kein
*/
void ADS_1260_SetDataRate(SPI_HandleTypeDef * hspi, uint8_t dataRate);

#endif // !_ADS_1260_H