/*!-------------------------------------------------------------------
    @brief  ADCSineCalculate2 - Calculate ADC Sine Value
	      ADCSineCalculate2(adc data array , adc array length, adc total sample time (us), Application variable , Magnification ) ; 

    @param  :ADCSineCalculate2(ADC_VT_Value, ADC1_SAMPLE_COUNT , 231 , &Adc.VT , 0.00322) ;   

    @output :1.Adc.VT.Freq
             2.Adc.VT.Avg
             3.Adc.VT.Vrms

    @notes  :None
    
    212 us = PCLK2 / 6 ( 1/(42M / 6) = 0.14us
    0.14us * ( 480 + 15 ) * 3 = 212 us
   ------------------------------------------------------------------- */
#include "sine.h"
#include "main.h"
#include "math.h"

MOVE_AVG_FILTER AC_Sine[3];

void ADCSineCalculate2(uint32_t *data, uint16_t adc_length, uint16_t adc_sample_time , MOVE_AVG_FILTER *SineValue, float Magn, uint8_t phase)
{  
  uint32_t max_value = 0 , min_value = 4095; 
  uint8_t  isSineWave;
  uint16_t Freq_Header_Grid = 0; 
  uint16_t Freq_Tail_Grid = 0; 
  uint16_t Freq_CLC_Grid = 0;   
  uint16_t idx_Cnt = 0;
  uint32_t Avg_offset_sum ; 
  float Avg_offset ;
  float MCU_Vin[ADC2_SAMPLE_COUNT] ;
  float Deviation_sum ;  
  
  for (uint32_t i = 0; i < adc_length ; i++) 
  {
    if (max_value < data[i]) { max_value = data[i] ; }
    if (min_value > data[i]) { min_value = data[i] ; }
  }
 
  if ((max_value - min_value) > 30)
  {
    isSineWave = ON ; 
  }  
  else
  {
    isSineWave = OFF ; 
  }
  
  if (isSineWave == ON)  
  { 
    for(uint16_t idx=0 ; idx<adc_length ; idx++)
    {
        if(((2048-60)<data[idx]) && (data[idx]<(2048+60)))
        {
            if(idx_Cnt == 0)
              {
                  Freq_Header_Grid = idx;
                  idx_Cnt++;
              }
              else
              {
                  if((73<=(idx-Freq_Header_Grid)) && ((idx-Freq_Header_Grid)<=104))
                  {                      
                      Freq_Tail_Grid = idx;
                      idx_Cnt++;
                  }
              }  
        }
                 
        if(idx_Cnt >= 2)
          break;
    }

    //Freq
    Freq_CLC_Grid = Freq_Tail_Grid - Freq_Header_Grid ;       
    if ((1000000/(adc_sample_time * Freq_CLC_Grid )) > 45 && (1000000/(adc_sample_time * Freq_CLC_Grid )) < 65)
    {
      //Freq
      //Freq_CLC_Grid = Freq_Tail_Grid - Freq_Header_Grid ; 
      SineValue->Freq = (1000000/(adc_sample_time * Freq_CLC_Grid )) ;
      
      //Avg
      Avg_offset_sum = 0 ; 
      for (uint32_t i = Freq_Header_Grid; i < Freq_Tail_Grid  ; i++) 
      {  
        Avg_offset_sum += data [i] ; 
      }
      Avg_offset = (float)(Avg_offset_sum/Freq_CLC_Grid)*3.3/4095 ; 
      SineValue->Avg = (uint16_t)(Avg_offset*100.0) ; 
      
      //Vrms
      Deviation_sum = 0 ; 
      for (uint32_t i=Freq_Header_Grid; i<Freq_Tail_Grid;i++)
      {
        MCU_Vin[i-Freq_Header_Grid] = (data[i]/4095.0*3.3);
        
        if (MCU_Vin[i-Freq_Header_Grid] > Avg_offset)
        {
          MCU_Vin[i-Freq_Header_Grid] = MCU_Vin[i-Freq_Header_Grid] - Avg_offset ; 
        }
        else
        {
          MCU_Vin[i-Freq_Header_Grid] = Avg_offset - MCU_Vin[i-Freq_Header_Grid] ; 
        }
        
        MCU_Vin[i-Freq_Header_Grid] = MCU_Vin[i-Freq_Header_Grid] / Magn;

        Deviation_sum += pow(MCU_Vin[i-Freq_Header_Grid] ,2);
      }

        SineValue->Vrms = (uint16_t)(sqrt(Deviation_sum / Freq_CLC_Grid)*100 ) ; 
    }
    else
    {
        switch(phase)
        {
            case 0:
              SineValue->Vrms = (uint16_t)adc_value.ADC2_IN0.value;
              break;
            case 1:
              SineValue->Vrms = (uint16_t)adc_value.ADC2_IN1.value;
              break;
            case 2:
              SineValue->Vrms = (uint16_t)adc_value.ADC2_IN2.value;
              break;
        }
    }    
  }  
  else
  {
      SineValue->Freq = 0 ; 
      
      Avg_offset_sum = 0 ; 
      for (uint32_t i = 0; i < adc_length  ; i++) 
      {  
        Avg_offset_sum += data [i] ; 
      }
      Avg_offset = (float)(Avg_offset_sum/adc_length)*3.3/4095 ; 
      SineValue->Avg = (uint16_t)(Avg_offset*100.0) ; 
      
      SineValue->Vrms = 0 ; 
  }
}