#include "Data_VehicleSpeed.h"
#include "Gauges.h"
#include "GaugesInterface.h"
#include "TimerB.h"

#define VEH_FILTER_LEN    7

static struct 
{
    uint8_t Count ;
    uint16_t Data[VEH_FILTER_LEN] ;
}VehcleFilter;

static uint32_t SPEED_PPK = 159246ul ; 
static uint32_t SPEED_RADIO = 637 ; 

uint16_t Vehicle_ACT_Speed;
uint16_t Vehicle_DISP_Speed;
uint8_t VehicleSpeedValid;
uint8_t Vehicle_CurSeg ;

static uint16_t Cal_VehSpeed(uint16_t Fre,uint8_t Len);

void Speed_KL30_Init(void)
{
    uint8_t i ;
    Vehicle_ACT_Speed = 0u;
    Vehicle_DISP_Speed = 0u;
    VehicleSpeedValid = 0u;
    Vehicle_CurSeg = 0u;
    VehcleFilter.Count = 0 ;
    for(i = 0 ;i < VEH_FILTER_LEN ;i ++)
    {
        VehcleFilter.Data[ i ] = 0 ;
    }

    Set_Speed_PPK(159246ul);
}
void Speed_KL15_ON_Init(void)
{
    uint8_t i ;
    Vehicle_ACT_Speed = 0u;
    Vehicle_DISP_Speed = 0u;
    VehicleSpeedValid = 0u;
    Vehicle_CurSeg = 0u;
    VehcleFilter.Count = 0 ;
    for(i = 0 ;i < VEH_FILTER_LEN ;i ++)
    {
        VehcleFilter.Data[ i ] = 0 ;
    }

    Veh_Fre_Init(Get_Speed_PPK()/10);
}
void Speed_KL15_OFF_Init(void)
{
    uint8_t i ;
    Vehicle_ACT_Speed = 0u;
    Vehicle_DISP_Speed = 0u;
    VehicleSpeedValid = 0u;
    Vehicle_CurSeg = 0u;
    VehcleFilter.Count = 0 ;
    for(i = 0 ;i < VEH_FILTER_LEN ;i ++)
    {
        VehcleFilter.Data[ i ] = 0 ;
    }
}
void Speed_Wakeup_Init(void)
{
    uint8_t i ;
    Vehicle_ACT_Speed = 0u;
    Vehicle_DISP_Speed = 0u;
    VehicleSpeedValid = 0u;
    Vehicle_CurSeg = 0u;
    for(i = 0 ;i < VEH_FILTER_LEN ;i ++)
    {
        VehcleFilter.Data[ i ] = 0 ;
    }
}
void Speed_Sleep_Init(void)
{
    uint8_t i ;
    Vehicle_ACT_Speed = 0u;
    Vehicle_DISP_Speed = 0u;
    VehicleSpeedValid = 0u;
    Vehicle_CurSeg = 0u;
    for(i = 0 ;i < VEH_FILTER_LEN ;i ++)
    {
        VehcleFilter.Data[ i ] = 0 ;
    }
}

void Speed_Processing_Service(void)
{
    uint32_t VehValTmp ;
    uint32_t PPK = Get_Speed_PPK();
    //if(Get_Veh_Fre_Event())
    //{
    //    VehValTmp = Cal_VehSpeed(Get_Veh_Fre(),VEH_FILTER_LEN) ;
    
    //    VehValTmp *= 3600 ;
    //    VehValTmp *= 10 ;
    //    VehValTmp *= 10 ;
    //    VehValTmp /= PPK ;

    //    Vehicle_ACT_Speed = VehValTmp ;
    //}

    VehValTmp = Cal_Veh_Frequency();

    VehValTmp *= 3600 ;
    VehValTmp *= 10 ;
    VehValTmp *= 10 ;
    VehValTmp /= PPK ;

    

    //VehValTmp = Cal_Veh_Frequency();
    //VehValTmp *= 3600 ;
    //VehValTmp *= 10 ;
    //VehValTmp /= PPK ;
  
    if(VehValTmp > 2250)
    {
        VehValTmp = 0 ;
        VehicleSpeedValid = 0 ;
    }
    else
    {
        VehicleSpeedValid = 1 ;
    }
    Vehicle_ACT_Speed = VehValTmp ;
    
//传入表头
    VehValTmp = VehSpeedAmplification((uint16_t)VehValTmp);
    SetGaugesPara(VehGauges, (uint16_t)VehValTmp);

//获得显示格和显示车速
    Vehicle_CurSeg = GetGaugesCurrentPos(VehGauges);
    Vehicle_DISP_Speed = GetVehDisVal(Vehicle_CurSeg,&GaugesInfo_Init_Table[VehGauges]);   


}

static uint16_t Cal_VehSpeed(uint16_t Fre,uint8_t Len)
{
    static uint16_t u16Result = 0 ;
    if(Fre > 2000)
    {
        //do nothing 
    }
    else
    {
        if(VehcleFilter.Count < Len)
        {
            VehcleFilter.Data[VehcleFilter.Count] = Fre ;
            VehcleFilter.Count ++ ;
        }
        else
        {   
            VehcleFilter.Count = 0 ;
            App_SortNByte(VehcleFilter.Data,Len);

            u16Result = VehcleFilter.Data[2] ;
            u16Result += VehcleFilter.Data[3] ;
            u16Result += VehcleFilter.Data[3] ;
            u16Result += VehcleFilter.Data[4] ;
            u16Result /= 4 ;
        }
    }

    return u16Result ;
}

/*-------------------------------------------------------------------------
 * Function Name  : Set_Speed_PPK
 * Description    : 设置PPK值,初始化 或需要改变时调用
 * Input          : 10倍的PPK
 * Output         : None
 * Return         : None
 * onther         : PPK = 频率 * 3600 / 车速
 --------------------------------------------------------------------------*/
void Set_Speed_PPK(uint32_t PPK)
{
	SPEED_PPK = PPK ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Set_Speed_PPK
 * Description    : 设置速比值,初始化 或需要改变时调用
 * Input          : 速比
 * Output         : None
 * Return         : None
 * onther         : 速比 = PPK / 脉冲
 --------------------------------------------------------------------------*/
void Set_Speed_Ratio(uint32_t Ratio)
{
    SPEED_RADIO = Ratio ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Get_Speed_PPK
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : 10倍PPK值
 * onther         : 
 --------------------------------------------------------------------------*/
uint32_t Get_Speed_PPK(void)
{
	uint32_t u32Result = 0u;
	u32Result = SPEED_PPK ;
	return u32Result ;
}


uint16_t Speed_Get_ActualValue(void)
{
    uint16_t u16Result = 0u;
    u16Result = Vehicle_ACT_Speed;
    return u16Result;
}
uint16_t Speed_Get_Display_Value(void)
{
    uint16_t u16Result = 0u;
    u16Result = Vehicle_DISP_Speed;
    return u16Result;
}
/*-------------------------------------------------------------------------
 * Function Name  : Speed_Get_CurSeg
 * Description    : 车速当前格
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : 应用于断码
 --------------------------------------------------------------------------*/
uint8_t Speed_Get_CurSeg(void)
{
    return Vehicle_CurSeg ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Speed_Get_Valid
 * Description    : 车速有效?
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
uint8_t Speed_Get_Valid(void)
{
    return VehicleSpeedValid ;
}