Services_Interval.c 5.6 KB
Newer Older
hu's avatar
hu committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
#include "Services_Interval.h"


/*该服务函数首次KL30是调用一次*/
void Data_Interval_KL30_Init(_DataInterVal *m_para1, _DataInputInterVal *m_para2)
{
    Data_Interval_Para.Sig.First_Flag = m_para1->Sig.First_Flag;/*0*/
    Data_Interval_Para.Sig.First_Interval = m_para1->Sig.First_Interval;/*5000km*/
    Data_Interval_Para.Sig.Second_Interval = m_para1->Sig.Second_Interval;/*7500km*/
    Data_Interval_Para.Sig.Timer_Interval = m_para1->Sig.Timer_Interval;/* 180*24*60*60*10  0.1s */
    Data_Interval_Para.Sig.DIM_KM = m_para1->Sig.DIM_KM;    /* DIM ODO */
    Data_Interval_Para.Sig.DIM_Timer = m_para1->Sig.DIM_Timer;/* DIM Timer */

    Data_Interval_Para.Sig.Servicekm = m_para1->Sig.Servicekm; /* Cur odo */
    Data_Interval_Para.Sig.ServiceTimer = m_para1->Sig.ServiceTimer; /* Cur timer */

    Data_Input_InterVal.PowerSts = m_para2->PowerSts;
}
/* 保养里程服务之前调用 */
void Data_Interval_KMSet(uint32_t CurTotalODO, uint8_t m_IG)
{
    Data_Interval_Para.Sig.Servicekm = CurTotalODO;
    Data_Input_InterVal.PowerSts = m_IG;
}
/* 100ms中断调用 */
void Data_Interval_TimerISR(void)
{
    if (Data_Interval_Para.Sig.ServiceTimer <= 0x1FFFFFFFul)
    {
        Data_Interval_Para.Sig.ServiceTimer++;
    }

}
/* Sleep之后停止计时  唤醒后 把这一阶段的时间差补正回来 */
void Data_Interval_TimerSleepFix(uint32_t FixTimer)
{
    if (Data_Interval_Para.Sig.ServiceTimer <= 0x1FFFFFFFul)
    {
        Data_Interval_Para.Sig.ServiceTimer += FixTimer;
    }
}

/******************************************************************************
函数名:Data_Service_Interval_Processing
功  能: 剩余保养里程处理
参  数: 无
返回值:无
******************************************************************************/
void Data_Service_Interval_Processing(void)
{
    if (Data_Input_InterVal.PowerSts == Services_PowerON)
    {
        if ((Data_Interval_Para.Sig.DIM_KM >= Data_Interval_Para.Sig.Servicekm) || \
                (Data_Interval_Para.Sig.DIM_Timer >= Data_Interval_Para.Sig.ServiceTimer))
        {
            if (Data_Interval_Para.Sig.DIM_KM >= Data_Interval_Para.Sig.Servicekm)
            {
                Servicekm = Data_Interval_Para.Sig.DIM_KM - Data_Interval_Para.Sig.Servicekm;
            }
            else
            {
                Servicekm = 0u;
            }

            if (Data_Interval_Para.Sig.DIM_Timer >= Data_Interval_Para.Sig.ServiceTimer)
            {
                ServiceTimer = Data_Interval_Para.Sig.DIM_Timer - Data_Interval_Para.Sig.ServiceTimer;
            }
            else
            {
                ServiceTimer = 0u;
            }
            if (Servicekm == 0u)
            {
                ServiceTimer = 0u;
            }
            if (ServiceTimer == 0u)
            {
                Servicekm = 0u;
            }
            Data_Service_Interval_Save_Call(&Data_Interval_Para, Services_NOForceSave);
        }
        else
        {
            Servicekm = 0u;
            ServiceTimer = 0u;
        }
    }
}


/******************************************************************************
函数名:Data_Service_Interval_Reset
功  能: 重置保养里程的目标里程,1是5000km;0是10000km
******************************************************************************/
void Data_Service_Interval_OverWriteDIM(uint8_t m_DIR)
{
    if (Data_Interval_Para.Sig.First_Flag == Services_FirstFlag)
    {
        if (m_DIR == 1u)
        {
            Data_Interval_Para.Sig.DIM_KM = 50000ul; /* DIM ODO */
        }
        else
        {
            Data_Interval_Para.Sig.DIM_KM = 100000ul; /* DIM ODO */
        }
        Data_Service_Interval_Save_Call(&Data_Interval_Para, Services_ForceSave);
    }
}


/******************************************************************************
函数名:Data_Service_Interval_Reset
功  能: 重置保养里程
******************************************************************************/
void Data_Service_Interval_Reset(_DataInterVal *m_para1, uint32_t m_CurODO)
{
    Data_Interval_Para.Sig.First_Flag = m_para1->Sig.First_Flag;/*0*/
    Data_Interval_Para.Sig.First_Interval = m_para1->Sig.First_Interval;/*5000km*/
    Data_Interval_Para.Sig.Second_Interval = m_para1->Sig.Second_Interval;/*7500km*/
    Data_Interval_Para.Sig.Timer_Interval = m_para1->Sig.Timer_Interval;/* 180*24*60*60*10  0.1s */
    if (Data_Interval_Para.Sig.First_Flag == Services_FirstFlag)
    {
        Data_Interval_Para.Sig.DIM_KM = Data_Interval_Para.Sig.First_Interval + m_CurODO; /* DIM ODO */
    }
    else
    {
        Data_Interval_Para.Sig.DIM_KM = Data_Interval_Para.Sig.Second_Interval + m_CurODO;  /* DIM ODO */
    }
    Data_Interval_Para.Sig.DIM_Timer = Data_Interval_Para.Sig.Timer_Interval;/* DIM Timer */

    Data_Interval_Para.Sig.Servicekm = m_CurODO; /* Cur odo */
    Data_Interval_Para.Sig.ServiceTimer = 0u; /* Cur timer */

    Data_Service_Interval_Save_Call(&Data_Interval_Para, Services_ForceSave);
}
/******************************************************************************
函数名:Get_IntervalKM
功  能: 获得保养里程
******************************************************************************/
uint32_t Get_IntervalKM(void)
{
    return Servicekm;/*87606-3*/
}
/******************************************************************************
函数名:Get_IntervalTime
功  能: 获得保养里程
******************************************************************************/
uint32_t Get_IntervalTime(void)
{
    return ServiceTimer;
}
/*
修改保养里程逻辑,内部不再判断报警信号
重置里程参数全靠外部传入
*/

uint16_t Read_Interval_Version(void)
{
    return 0x0003u;
}