Services_Mileage_User.c 10.6 KB
Newer Older
李俭双's avatar
李俭双 committed
1 2 3

#include "Components.h"
__align(4)
4
uint8_t DataMilleageBuf[Data_MEM_Block_Mileage];
李俭双's avatar
李俭双 committed
5 6 7 8
uint8_t DataODOBuf[Data_MEM_Block_ODO];
uint8_t DataTripBuf[Data_MEM_Block_Trip * EM_TRIP_MAX];
Mileage_t g_WriteMileage;
Mileage_t g_ReadMileage;
9 10 11 12 13 14
uint16_t odo_writeState;
uint16_t odoclr_writeState;
uint16_t trip_writeState;
uint16_t trip_readState;
uint16_t odo_readState;
//uint8_t odo_readState;
李俭双's avatar
李俭双 committed
15 16 17 18 19 20 21 22 23 24
uint32_t Milleage_InitFlag = 0U;
/******************************************************************************
  Function:Data_ODO_KL30Init
  Description:
  Input:
  Output:
 ******************************************************************************/
void Data_User_Mileage_KL30Init(void)
{
    uint32_t TempBuf[20] = {0};
25
    uint8_t TempBufUser[20] = {0};
李俭双's avatar
李俭双 committed
26 27 28
    Mileage_Init_t MileInit = {0};
    Mileage_Func_t Func = {0};
    ODO_Init_t ODOInit = {0};
时昊's avatar
时昊 committed
29
    uint32_t Maintenance_Firstflg[1u] = {0};
李俭双's avatar
李俭双 committed
30
    Trip_Init_t TripInit[4] = {0};
31
    uint8_t TPMSLearn[2] = {0,0};
李俭双's avatar
李俭双 committed
32 33 34 35 36 37
    Milleage_InitFlag = 0U;
    // �������ݴ�EEPROM�ж�ȡ
    (void)Data_User_EEPROM_Read(EM_MILEAGE_BLOCK, TempBuf, 1);
    if (TempBuf[0] == 0xFFFFFFFF)
    {
        MileInit.Mileage = 0u;
陈家乐's avatar
陈家乐 committed
38 39 40
    }          
    else                           
    {             
李俭双's avatar
李俭双 committed
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
        MileInit.Mileage = TempBuf[0];
    }
    Func.Get_Sys_IG_Sts = Common_Get_IG_Sts;
    Func.Get_Act_V_Speed_Valid = Common_Get_Act_V_Speed_Valid;
    Func.Get_Act_V_Speed = Common_Get_Act_V_Speed_ODO;
    Func.Get_TireSize = (void *)0;
    Func.EEPromWrite_Cbk = Data_User_EEPROM_Write; // ��ʱδ����
    Data_Mileage_KL30_Init(DataMilleageBuf, &MileInit, &Func);

    (void)Data_User_EEPROM_Read(EM_ODO_BLOCK, TempBuf + 1, 2);
    if (TempBuf[1] == 0xFFFFFFFF)
    {
        ODOInit.Stamp = 0;
    }
    else
    {
        ODOInit.Stamp = TempBuf[1];
    }
    if (TempBuf[1] == 0xFFFFFFFF)
    {
        ODOInit.Offset = 0;
    }
    else
    {
65
        ODOInit.Offset = TempBuf[1];
李俭双's avatar
李俭双 committed
66
    }
67
    ODOInit.MaxValue = 1999990;
李俭双's avatar
李俭双 committed
68 69
    Data_ODO_KL30_Init(DataODOBuf, &ODOInit, Func.EEPromWrite_Cbk);

陈家乐's avatar
陈家乐 committed
70
    (void)Data_User_EEPROM_Read(EM_TRIP_BLOCK, TempBuf + 3, 2);
李俭双's avatar
李俭双 committed
71 72 73 74 75 76 77 78
    if (TempBuf[3] == 0XFFFFFFFF)
    {
        TripInit[EM_TRIP_A].Stamp = 0;
    }
    else
    {
        TripInit[EM_TRIP_A].Stamp = TempBuf[3];
    }
79 80 81 82 83 84 85 86 87
    if (TempBuf[4] == 0XFFFFFFFF)
    {
        TripInit[EM_TRIP_A].Offset = 0;
    }
    else
    {
        TripInit[EM_TRIP_A].Offset = TempBuf[4];
    }
    //TripInit[EM_TRIP_A].Offset = TempBuf[4];
88
    TripInit[EM_TRIP_A].MaxValue = 9999; /* 最大999.9km 进行复位 */
李俭双's avatar
李俭双 committed
89 90
    TripInit[EM_TRIP_A].IsRestart = 1u;

91 92 93 94 95 96 97 98 99 100 101
    //TripInit[EM_TRIP_B].Stamp = 0xFFFFFFFFu;
    //TripInit[EM_TRIP_B].MaxValue = 99999;
    //TripInit[EM_TRIP_B].IsRestart = 1u;
//
    //TripInit[EM_TRIP_C].Stamp = 0xFFFFFFFFu;
    //TripInit[EM_TRIP_C].MaxValue = 99999;
    //TripInit[EM_TRIP_C].IsRestart = 1u;
//
    //TripInit[EM_TRIP_D].Stamp = 0xFFFFFFFFu;
    //TripInit[EM_TRIP_D].MaxValue = 99999;
    //TripInit[EM_TRIP_D].IsRestart = 1u;
李俭双's avatar
李俭双 committed
102 103
    Data_Trip_KL30_Init(DataTripBuf, TripInit, EM_TRIP_MAX, Func.EEPromWrite_Cbk);

104
    //Data_User_EEPROM_Read(EM_MenuData_Tcs_Val, TempBuf, 1u); 
陈家乐's avatar
陈家乐 committed
105
    eeprom_ReadRecord(EEPROM_BLOCK_08, (uint8_t *)TempBufUser,  1);  
106
    if (TempBufUser[0u] == 0xFF)
107 108
    {     
        MenuData.Tcs_Val = 1;      
109 110
        //Data_User_EEPROM_Write(EM_MenuData_Tcs_Val, &MenuData.Tcs_Val, 1u);  
        eeprom_WriteRecord(EEPROM_BLOCK_08, &MenuData.Tcs_Val,  1);
111 112
    }

113
    //Data_User_EEPROM_Read(EM_MenuData_TPMS_LEARN, TempBuf, 1u);  
陈家乐's avatar
陈家乐 committed
114
    eeprom_ReadRecord(EEPROM_BLOCK_09, (uint8_t *)TempBufUser,  2);
115
    if (TempBufUser[0u] == 0xFF)
116
    { 
117
        TPMSLearn[0] =  0;//MenuData.TPMS_Front_Learn;   
118 119 120
        TPMSLearn[1] =  0;//MenuData.TPMS_Rear_Learn;        
        //Data_User_EEPROM_Write(EM_MenuData_TPMS_LEARN, (uint32_t *)TPMSLearn, 1u); 
        eeprom_WriteRecord(EEPROM_BLOCK_09, TPMSLearn, 2); 
121 122
    }

李俭双's avatar
李俭双 committed
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
    Milleage_InitFlag = 0X5AA53AA3UL;

}

void Data_User_Mileage_WakeupInit(void)
{
    Mileage_Func_t Func = {0};
    Milleage_InitFlag = 0U;

    Func.Get_Sys_IG_Sts = Common_Get_IG_Sts;
    Func.Get_Act_V_Speed_Valid = Common_Get_Act_V_Speed_Valid;
    Func.Get_Act_V_Speed = Common_Get_Act_V_Speed_ODO;
    Func.Get_TireSize = (void *)0;
    Func.EEPromWrite_Cbk = Data_User_EEPROM_Write; // ��ʱδ����
    Data_Mileage_Wakeup_Init(DataMilleageBuf, &Func);

    Data_ODO_Wakeup_Init(DataODOBuf, Func.EEPromWrite_Cbk);

    Data_Trip_Wakeup_Init(DataTripBuf, EM_TRIP_MAX, Func.EEPromWrite_Cbk);
    Milleage_InitFlag = 0X5AA53AA3UL;
}

uint32_t Get_MileageInit_Status(void)
{
    return Milleage_InitFlag;
}

150
uint32_t Data_User_EEPROM_Read(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len)
李俭双's avatar
李俭双 committed
151
{
陈家乐's avatar
陈家乐 committed
152
    uint16_t timeout = 0;
李俭双's avatar
李俭双 committed
153 154 155 156 157 158 159 160
    switch (u16BlockID)
    {
    case EM_MILEAGE_BLOCK:
        odo_readState = eeprom_ReadODO(&g_ReadMileage);
        u32Data[0] = g_ReadMileage.Odo / 100;
        break;

    case EM_ODO_BLOCK:
陈家乐's avatar
陈家乐 committed
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
        timeout = 0;
        odo_readState = eeprom_ReadRecord(EEPROM_BLOCK_01, (uint8_t *)u32Data, u16Len * 4);
        while(odo_readState != WRITE_COMPLETE)
        {
            //eeprom_comm_DelayUs(5000);
            odo_readState = eeprom_ReadRecord(EEPROM_BLOCK_01, (uint8_t *)u32Data, u16Len * 4);
            timeout++;
            if(odo_readState == WRITE_COMPLETE)
            {
                break;
            }
            if(timeout >= 3)
            {
                break;
            }
        }
李俭双's avatar
李俭双 committed
177 178 179
        break;

    case EM_TRIP_BLOCK:
陈家乐's avatar
陈家乐 committed
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
        timeout = 0;
        odo_readState = eeprom_ReadRecord(EEPROM_BLOCK_03, (uint8_t *)u32Data, u16Len * 4);
        while(odo_readState != WRITE_COMPLETE)
        {
            //eeprom_comm_DelayUs(5000);
            odo_readState = eeprom_ReadRecord(EEPROM_BLOCK_03, (uint8_t *)u32Data, u16Len * 4);
            timeout++;
            if(odo_readState == WRITE_COMPLETE)
            {
                break;
            }
            if(timeout >= 3)
            {
                break;
            }
        }
李俭双's avatar
李俭双 committed
196 197
        break;

198 199 200
    // case EM_Maintenance_BLOCK:
    //     eeprom_ReadRecord(EEPROM_BLOCK_05, (uint8_t *)u32Data, u16Len * 4);
    //     break;
时昊's avatar
时昊 committed
201

202 203 204
    // case EM_Maintenance_Firstflg:
    //     eeprom_ReadRecord(EEPROM_BLOCK_07, (uint8_t *)u32Data, u16Len * 4);
    //     break;
205 206 207 208 209 210
    // case EM_MenuData_Tcs_Val:
    //     eeprom_ReadRecord(EEPROM_BLOCK_08, (uint8_t *)u32Data, u16Len * 4);
    //     break;
    // case EM_MenuData_TPMS_LEARN:
    //     eeprom_ReadRecord(EEPROM_BLOCK_09, (uint8_t *)u32Data, u16Len * 2);
    //     break;
211
    
时昊's avatar
时昊 committed
212

李俭双's avatar
李俭双 committed
213 214 215 216 217 218 219
    default:
        break;
    }

    return 0;
}

时昊's avatar
时昊 committed
220
 void Data_User_EEPROM_Write(Data_EEPROM_Enum_t BlockID, uint32_t u32Data[], uint16_t u16Len)
李俭双's avatar
李俭双 committed
221 222
{
    // uint8_t i = 0u;
223
    uint8_t timeout = 0;
李俭双's avatar
李俭双 committed
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
    switch (BlockID)
    {
    case EM_MILEAGE_BLOCK:
        if (u32Data[0] == 0)
        {
            eeprom_ClearOdoSection();
        }
        else
        {
            g_WriteMileage.Odo = u32Data[0] * 100;
            odo_writeState = WRITE_FAIL;
            odo_writeState = eeprom_WriteODO(&g_WriteMileage, distance_100m, 1);
        }
        break;

    case EM_ODO_BLOCK:
240
        timeout = 0;
241
        odoclr_writeState = eeprom_WriteRecord(EEPROM_BLOCK_01, (uint8_t *)u32Data, u16Len * 4);
陈家乐's avatar
陈家乐 committed
242
        while(odoclr_writeState != WRITE_COMPLETE)
243
        {
陈家乐's avatar
陈家乐 committed
244
            //eeprom_comm_DelayUs(5000);
陈家乐's avatar
陈家乐 committed
245
            odoclr_writeState = eeprom_WriteRecord(EEPROM_BLOCK_01, (uint8_t *)u32Data, u16Len * 4);
246
            timeout++;
陈家乐's avatar
陈家乐 committed
247
            if(odoclr_writeState == WRITE_COMPLETE)
248 249 250 251 252 253 254 255
            {
                break;
            }
            if(timeout >= 3)
            {
                return;
            }
        }
李俭双's avatar
李俭双 committed
256 257 258
        break;

    case EM_TRIP_BLOCK:
259
        timeout = 0;
260
        trip_writeState = eeprom_WriteRecord(EEPROM_BLOCK_03, (uint8_t *)u32Data, u16Len * 4);
陈家乐's avatar
陈家乐 committed
261
        while(trip_writeState != WRITE_COMPLETE)
262
        {
陈家乐's avatar
陈家乐 committed
263
            //eeprom_comm_DelayUs(5000);
264 265 266 267
        trip_writeState = eeprom_WriteRecord(EEPROM_BLOCK_03, (uint8_t *)u32Data, u16Len * 4);
        timeout++;
        if(trip_writeState == WRITE_COMPLETE)
        {
268
                break;
269
        }
270
            if(timeout >= 3)
271
        {
272
                return;
273
        }
274
        }
李俭双's avatar
李俭双 committed
275 276
        break;

277 278 279
    // case EM_Maintenance_BLOCK:
    //     eeprom_WriteRecord(EEPROM_BLOCK_05, (uint8_t *)u32Data, u16Len * 4);
    //     break;
时昊's avatar
时昊 committed
280

281 282 283
    // case EM_Maintenance_Firstflg:
    //     eeprom_WriteRecord(EEPROM_BLOCK_07, (uint8_t *)u32Data, u16Len * 4);
    //     break;
284 285 286 287 288 289
    // case EM_MenuData_Tcs_Val:
    //     eeprom_WriteRecord(EEPROM_BLOCK_08, (uint8_t *)u32Data, u16Len * 1);
    //     break;
    // case EM_MenuData_TPMS_LEARN:
    //     eeprom_WriteRecord(EEPROM_BLOCK_09, (uint8_t *)u32Data, u16Len * 2);
    //     break;
李俭双's avatar
李俭双 committed
290 291 292 293 294 295 296
    default:
        break;
    }
}

void Services_Mileage_Callback(void)
{
297
    //Data_Mileage_ISR();
李俭双's avatar
李俭双 committed
298 299
    Data_ODO_Processing();
    Data_Trip_Processing();
300
    //Trip_Clear_Km_Service();
李俭双's avatar
李俭双 committed
301 302 303 304 305 306 307 308 309
}

/**
 * @brief 获取大计里程值
 * @return 根据当前单位输出对应大计里程值
 */
uint32_t Get_ODO_Value(void)
{
    uint32_t ODO = 0;
时昊's avatar
时昊 committed
310
    if (Get_Dis_KM_Unit() == 0) /* 公制 */
李俭双's avatar
李俭双 committed
311 312 313
    {
        ODO = Data_ODO_Read();
    }
时昊's avatar
时昊 committed
314
    else if (Get_Dis_KM_Unit() == 1) /* 英制 */
李俭双's avatar
李俭双 committed
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
    {
        ODO = Data_Km_To_Mile(Data_ODO_Read());
    }
    else /* 无效值,按照公里处理,理论上不会执行到这 */
    {
        ODO = Data_ODO_Read();
    }
    return ODO;
}

/**
 * @brief 获取小计里程值
 * @return 根据当前单位输出对应小计里程值
 */
uint32_t Get_Trip_Value(void)
{
    uint32_t Trip = 0;
时昊's avatar
时昊 committed
332
    if (Get_Dis_KM_Unit() == 0) /* 公制 */
李俭双's avatar
李俭双 committed
333 334 335
    {
        Trip = Data_Read_Trip(EM_TRIP_A);
    }
时昊's avatar
时昊 committed
336
    else if (Get_Dis_KM_Unit() == 1) /* 英制 */
李俭双's avatar
李俭双 committed
337 338 339 340 341 342 343 344 345
    {
        Trip = Data_Km_To_Mile(Data_Read_Trip(EM_TRIP_A));
    }
    else /* 无效值,按照公里处理,理论上不会执行到这 */
    {
        Trip = Data_Read_Trip(EM_TRIP_A);
    }
    return Trip;
}
346

李俭双's avatar
李俭双 committed
347 348 349 350 351 352
/**
 * @brief 当前单位在KM时,小计里程大于999.9KM,主动触发小计清零
 *
 */
void Trip_Clear_Km_Service(void)
{
时昊's avatar
时昊 committed
353
    if (Get_Dis_KM_Unit() == 0) /* 公制 */
李俭双's avatar
李俭双 committed
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
    {
        if (Data_Read_Trip(EM_TRIP_A) > 9999) /* 当前单位在KM时,里程大于999.9KM进行清零 */
        {
            Data_Clear_Trip_All();
        }
    }
}


/**
 * @brief 触发单位转换时调用,如当前单位英里且里程大于621Mile时,单位转换为公里后需主动写入小计里程为999.9KM;
 * 需要单位转换标志位赋值后进行调用!!!
 * 
 */
void Unit_Convert_Service(void)
{
时昊's avatar
时昊 committed
370
    if (Get_Dis_KM_Unit() == 0) /* 公制 */
李俭双's avatar
李俭双 committed
371 372 373 374 375 376
    {
        if (Data_Read_Trip(EM_TRIP_A) > 9999) /* 当前单位在KM时,里程大于999.9KM进行清零 */
        {
            Data_Write_Trip(EM_TRIP_A, 9999);
        }
    }   
时昊's avatar
时昊 committed
377 378 379 380 381

    if (Get_Dis_Tpms_Unit() == 0) /* bar */
    {
        ;
    }
李俭双's avatar
李俭双 committed
382 383 384 385
}