/**
 * @file HTPA_32x32d.h
 * @brief Header for HTPA 32x32d infrared array sensor library
 * @author Tim-Erik Düntzsch t.duentzsch@fasttube.de
 * 
 * @date 25.03.2023 - first implementation (untested)
 * 
 * @todo finish HTPA_ReadBlock function
 * @todo add calibration function
 * @todo add temperature conversion function
 * 
 * @test communication and readout
 * 
 * @version 0.1
 */

#include <stdbool.h>

#ifndef INC_HTPA_32X32D_H_
#define INC_HTPA_32X32D_H_


#define ReadToFromTable
// ToDo: Sensor selection / add shortened lookup tables for selection:
#define HTPA32x32dL2_1HiSiF5_0_Gain3k3
//#define HTPA32x32dR1L2_1HiSiF5_0_Gain3k3_Extended

#ifdef HTPA32x32dL2_1HiSiF5_0_Gain3k3
#define TABLENUMBER   114
#define PCSCALEVAL    100000000 //327000000000    //PixelConst scale value for table... lower 'L' for (long)
#define NROFTAELEMENTS  7
#define NROFADELEMENTS  180 	//because of shortened lookup table (capped at 300°C) //1595 default (~930°C)
#define TAEQUIDISTANCE  100   	//dK
#define ADEQUIDISTANCE  64    	//dig
#define ADEXPBITS   6   //2^ADEXPBITS=ADEQUIDISTANCE
#define TABLEOFFSET   1024
#define EQUIADTABLE   //if defined, ADELEMENTS have to be 2^N quantizied! else more CPU Power is needed
#ifdef EQUIADTABLE
#undef FLOATTABLE
#endif
#define MBITTRIMDefault 0x2C  //use REF_CAL=2 here. Table does not match, so GlobalGain ist set to 50 % to compensate this.
#define SensRv 1        //Sensor Revision is set to 1 (Redesign)
#endif

#ifdef HTPA32x32dR1L2_1HiSiF5_0_Gain3k3_Extended
#define TABLENUMBER   114
#define PCSCALEVAL    100000000 //327000000000    //PixelConst scale value for table... lower 'L' for (long)
#define NROFTAELEMENTS  12
#define NROFADELEMENTS  1595  //130 possible due to Program memory, higher values possible if NROFTAELEMENTS is decreased
#define TAEQUIDISTANCE  100   //dK
#define ADEQUIDISTANCE  64    //dig
#define ADEXPBITS   6   //2^ADEXPBITS=ADEQUIDISTANCE
#define TABLEOFFSET   1792
#define EQUIADTABLE   //if defined, ADELEMENTS have to be 2^N quantizied! else more CPU Power is needed
#ifdef EQUIADTABLE
#undef FLOATTABLE
#endif
#define MBITTRIMDefault 0x2C
#define SensRv 1
#endif

/// @brief HTPA status register struct
typedef struct {
	uint8_t block;	// currently selected block
	bool vdd_meas;	// selection whether first two bytes are VDD or PTA
	bool blind;
	bool eoc;		// end of conversion flag
} HTPA_Status;



void HTPA_Init(I2C_HandleTypeDef *hi2c);
void HTPA_ReadSensor(uint32_t dataArray[32]);
uint8_t HTPA_ReadEEPROM_byte(uint16_t address);
void HTPA_WriteRegister(uint8_t address, uint8_t byte);
void HTPA_ReadRegister(uint8_t address, uint8_t* pData, uint16_t length);
void HTPA_GetStatus(void);

uint32_t HTPA_calcPowerTwo(uint8_t power);


#endif /* INC_HTPA_32X32D_H_ */