/*
 * adc.c
 *
 * Created: 30/05/2018 11:36:44
 *  Author: Ledo
 */ 

#include "asf.h"

/** Reference voltage for AFEC in mv. */
#define VOLT_REF        (3300)

/** The maximal digital value */
#define MAX_DIGITAL     (4095UL)

/** AFEC channel for potentiometer */
//#define AFEC_CHANNEL_POTENTIOMETER  AFEC_CHANNEL_5
struct afec_config afec_cfg0;
struct afec_ch_config afec_ch_cfg0;
struct afec_config afec_cfg1;
struct afec_ch_config afec_ch_cfg1;

//Prototypes
void Adc_init(void);    //Initialize MCU Peripherals
int16_t read_adc_channel(uint8_t ch);
int16_t Adc1_read_adc_channel0(void);

//Initialize adc con asf
void Adc_init(void)
{
	afec_enable(AFEC0);
	afec_get_config_defaults(&afec_cfg0);
	afec_init(AFEC0, &afec_cfg0);
	afec_ch_get_config_defaults(&afec_ch_cfg0);

	/*
	 * Because the internal AFEC offset is 0x800, it should cancel it and shift
	 * down to 0.
	 */
	afec_channel_set_analog_offset(AFEC0, AFEC_CHANNEL_0, 0x800);
	afec_ch_set_config(AFEC0, AFEC_CHANNEL_0, &afec_ch_cfg0);
	afec_set_trigger(AFEC0, AFEC_TRIG_SW);
	
	afec_channel_set_analog_offset(AFEC0, AFEC_CHANNEL_1, 0x800);
	afec_ch_set_config(AFEC0, AFEC_CHANNEL_1, &afec_ch_cfg0);
	afec_set_trigger(AFEC0, AFEC_TRIG_SW);
	
	afec_channel_set_analog_offset(AFEC0, AFEC_CHANNEL_2, 0x800);
	afec_ch_set_config(AFEC0, AFEC_CHANNEL_2, &afec_ch_cfg0);
	afec_set_trigger(AFEC0, AFEC_TRIG_SW);
	
	afec_channel_set_analog_offset(AFEC0, AFEC_CHANNEL_3, 0x800);
	afec_ch_set_config(AFEC0, AFEC_CHANNEL_3, &afec_ch_cfg0);
	afec_set_trigger(AFEC0, AFEC_TRIG_SW);


	/* Enable channel  */
	afec_channel_enable(AFEC0, AFEC_CHANNEL_0);
	afec_channel_enable(AFEC0, AFEC_CHANNEL_1);
	afec_channel_enable(AFEC0, AFEC_CHANNEL_2);
	afec_channel_enable(AFEC0, AFEC_CHANNEL_3);

	afec_enable(AFEC1);
	afec_get_config_defaults(&afec_cfg1);
	afec_init(AFEC1, &afec_cfg1);
	afec_ch_get_config_defaults(&afec_ch_cfg1);

	/*
	 * Because the internal AFEC offset is 0x800, it should cancel it and shift
	 * down to 0.
	 */
	afec_channel_set_analog_offset(AFEC1, AFEC_CHANNEL_0, 0x800);
	afec_ch_set_config(AFEC1, AFEC_CHANNEL_0, &afec_ch_cfg0);
	afec_set_trigger(AFEC1, AFEC_TRIG_SW);
	/* Enable channel  */
	afec_channel_enable(AFEC1, AFEC_CHANNEL_0);

	
}


int16_t Adc0_read_adc_channel(uint8_t ch)
{
	 //Start convertion
     afec_start_software_conversion(AFEC0);	 
	 while(!AFEC0->AFEC_ISR & AFEC_ISR_ENDRX);
	 return afec_channel_get_value(AFEC0, ch);
}

int16_t Adc1_read_adc_channel0(void)
{
	//Start convertion
	afec_start_software_conversion(AFEC1);
	while(!AFEC1->AFEC_ISR & AFEC_ISR_ENDRX);
	return afec_channel_get_value(AFEC1, 0);
}