#include "FM_ADC.h"

/* adc采集转换的比例 */
/* 安卓系统启动后输出这个电压 */
static float P_PwrOn_Voltage;
/* 输入网关的电压 */
static float P_In_Voltage;
/* 输入网关的电流 */
static float P_In_Current;

/* 参考电压的大小 */
#define referenceVoltage 3.3f


/**
  * @brief  将采集的adc进行校准
  * @param  val 采集的adc数据
  * @retval     校准后的adc数据
  */
static uint16_t Get_ConversionVal(int16_t val)
{
    if((val + Calibrattion_Val) < 0 || val == 0)
        return 0;
    if((Calibrattion_Val + val) > 4095 || val == 4095)
        return 4095;
    return (val + Calibrattion_Val);
}


/**
  * @brief  初始化adc
  * @param
  * @retval
  */
void FM_ADC_Init(void)
{
    HD_ADC_InIt();
    ADC_DMA_Init();
    startAdcCapture();
}

/**
  * @brief  初始化转换的比例
  * @param
  * @retval
  */
void proportionalInt(void)
{
    P_PwrOn_Voltage = referenceVoltage / 4095.0f;
    P_In_Voltage = ((100.0f + 10.0f) / 10.0f) * referenceVoltage / 4095.0f;
    P_In_Current = ((1.0f / 50.0f) / (0.01f)) * referenceVoltage / 4095.0f;
}

/**
  * @brief  得到soc启动后输出电压
  * @param
  * @retval
  */
float getSOCPwrOnVoltage(void)
{
    return (Get_ConversionVal(adcData[PwrOnNum]) * P_PwrOn_Voltage);
}

/**
  * @brief  得到输入网关盒子的电流
  * @param
  * @retval
  */
float getInCurrent(void)
{
    return (Get_ConversionVal(adcData[CurrentNum]) * P_In_Current);
}

/**
  * @brief  得到输入网关盒子的电压
  * @param
  * @retval
  */
float getInVoltage(void)
{
    return (Get_ConversionVal(adcData[VoltageNum]) * P_In_Voltage);
}

/**
  * @brief  得到网关盒子中的温度
  * @param
  * @retval
  */
float getTemperature(void)
{
    return (Get_ConversionVal(adcData[TemperatureNum]));
}

/**
  * @brief  打印adc生成的数据
  * @param
  * @retval
  */
void printf_adc_data(void)
{
    printf("adc : %d, %d, %d, %d\n", adcData[0], adcData[1], adcData[2], adcData[3]);
    printf("getSOCPwrOnVoltage: %d\n", (int)(getSOCPwrOnVoltage() * 1000.0f));
    printf("getInCurrent: %d\n", (int)(getInCurrent() * 1000.0f));
    printf("getInVoltage: %d\n", (int)(getInVoltage() * 1000.0f));
    printf("getTemperature: %d\n", (int)(getTemperature() * 1000.0f));
}