#include "Accelerometer.h"

void ACCELEROMETER_Init(void){
    RCC -> CFGR |= (0x1<<15);
    RCC-> CFGR &= ~ (0x1<<14);
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
		LL_APB1_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
		
    LL_GPIO_InitTypeDef pc0, pc1;
		LL_ADC_InitTypeDef adc;
    LL_ADC_REG_InitTypeDef adcReg;
    
		LL_GPIO_StructInit(&pc0);
		pc0.Pin = LL_GPIO_PIN_0;
		pc0.Mode = LL_GPIO_MODE_ANALOG;
		LL_GPIO_Init(GPIOA, &pc0);
	
		LL_GPIO_StructInit(&pc1);
		pc1.Pin = LL_GPIO_PIN_1;
		pc1.Mode = LL_GPIO_MODE_ANALOG;
		LL_GPIO_Init(GPIOA, &pc1);
	
	
		adc.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
		adc.SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE;
		LL_ADC_Init(ADC1, &adc);
	
    adcReg.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE ;
    adcReg.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
    adcReg.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
    adcReg.ContinuousMode = LL_ADC_REG_CONV_SINGLE;
    adcReg.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;    
    
    LL_ADC_REG_Init(ADC1, &adcReg);
    LL_ADC_Enable(ADC1);
}

double ACCELEROMETER_GetX(void){
	LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_1);
	LL_ADC_REG_StartConversionSWStart(ADC1);
	while (LL_ADC_IsActiveFlag_EOS(ADC1) != 1);
	double x= LL_ADC_REG_ReadConversionData12(ADC1);
	return x;
}

double ACCELEROMETER_GetY(void){
	LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_11);
	LL_ADC_REG_StartConversionSWStart(ADC1);
    while (LL_ADC_IsActiveFlag_EOS(ADC1) != 1);
    double y = LL_ADC_REG_ReadConversionData12(ADC1);
		return y;
}

int ACCELEROMETER_AngleGood(void){
	double x = ACCELEROMETER_GetX();
	double y = ACCELEROMETER_GetY();
	double angle = x/y;
	
    if (angle>tan(0.698132)){
        return 0;
    }else {
        return 1;
    }
    //le flag EOC n'est jamais mis à un ....
    // Soit la conversion est mal faite soit on n'utilise pas bien la simulation 
    //soit on n'utilise pas bien isActiveFlag dans la boucle
}
