Services_Mileage.h 12.1 KB
Newer Older
李俭双's avatar
李俭双 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
/**
 * @file        Services_Mileage.c
 * @brief       里程服务函数
 * @details     里程服务函数,包括大计、小计
 * @author      myliu
 * @date        2022.05.10
 * @version     V1.0
 * @copyright   myiu
 */
#ifndef SERVICE_MILEAGE_H
#define SERVICE_MILEAGE_H

/*
Platform_32Bit
Platform_16Bit
*/

#ifdef Platform_16Bit
#define Millib_uint8_t unsigned char
#define Millib_uint16_t unsigned int
#define Millib_uint32_t unsigned long

#else
#define Millib_uint8_t unsigned char
#define Millib_uint16_t unsigned short
#define Millib_uint32_t unsigned int
#define Millib_uint64_t unsigned long long
#endif

#ifndef Millib_NULL
#define Millib_NULL (void *)0u
#endif /* NULL */

/**@enum     小计里程枚举
 * @brief    用来区分每个小计里程数
 */
typedef enum
{
    EM_TRIP_A,
    EM_TRIP_B,
    EM_TRIP_C,
    EM_TRIP_D,
    EM_TRIP_MAX,
} DataTripEnum_t;

/**@enum     EEPROM存储块枚举类型
 * @brief    用来区分EEPORM存储区域
 */
typedef enum
{
    EM_MILEAGE_BLOCK = 0u, /**< 累计里程 */
    EM_ODO_BLOCK,          /**< 总计里程 */
    EM_TRIP_BLOCK,         /**< 小计里程 */
    EM_Maintenance_BLOCK,  /**< 保养里程 */
时昊's avatar
时昊 committed
55
    EM_Maintenance_Firstflg,  /**< 保养标志 */
56
    EM_MenuData_Tcs_Val,  /**< TCS开关标志 */
57
    EM_MenuData_TPMS_LEARN,  /**< TPMS学习结果 */
李俭双's avatar
李俭双 committed
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 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376
} Data_EEPROM_Enum_t;

typedef void (*EEPromWrite)(Data_EEPROM_Enum_t BlockID, Millib_uint32_t u32Data[], Millib_uint16_t u16Len);
typedef Millib_uint8_t (*GetRunValid)(void);

typedef struct
{
    Millib_uint8_t (*Get_Sys_IG_Sts)(void);        /**< 获取系统电源状态,请务必填写函数名或NULL */
    Millib_uint8_t (*Get_Act_V_Speed_Valid)(void); /**< 实际车速有效位,请务必填写函数名或NULL */
    Millib_uint16_t (*Get_Act_V_Speed)(void);      /**< 实际车速,请务必填写函数名或NULL */
    Millib_uint16_t (*Get_TireSize)(void);         /**< 轮胎系数,请务必填写函数名或NULL */
    EEPromWrite EEPromWrite_Cbk;                   /**< 写EEPROM回调函数,请务必填写函数名或NULL */
} Mileage_Func_t;

typedef struct
{
    Millib_uint32_t Mileage; /**< KL30初始化时,从EEPROM读取的数据 */
} Mileage_Init_t;

typedef struct
{
    Millib_uint32_t Stamp;    /**< 在Mileage上记录的里程戳 */
    Millib_uint32_t Offset;   /**< 里程偏移量,暂不使用,预留 */
    Millib_uint32_t MaxValue; /**< 最大的总计里程,单位100m */
} ODO_Init_t;

typedef struct
{
    Millib_uint32_t EngODO;    /**< 在Mileage上记录的里程戳 */
    Millib_uint32_t MaxValue; /**< 最大的总计里程,单位100m */
} EngODO_Init_t;

typedef struct
{
    Millib_uint32_t Stamp;    /**< 在Mileage上记录的里程戳, 需要存储在EEprom */
    Millib_uint32_t Offset;   /**< 小计里程偏移量,, 需要存储在EEprom */
    Millib_uint32_t MaxValue; /**< 最大的小计里程,单位100m */
    Millib_uint8_t IsRestart; /**< 小计里程达到最大值后,是否自动从0开始,重新累计小计里程 */
} Trip_Init_t;

#define Data_MEM_Block_Mileage ((Millib_uint8_t)12u)
#define Data_MEM_Block_ODO ((Millib_uint8_t)16u)
#define Data_MEM_Block_EngODO ((Millib_uint8_t)8u)
#define Data_MEM_Block_Trip ((Millib_uint8_t)20u)
/*
total size =Data_MEM_Block_Trip*EM_TRIP_MAX
*/

/**
 * @brief 里程服务初始化,KL30调用,必须调用,否则造成空指针
 * @param[in] pMemSpace 内存空间,需要的空间大小至少大于Data_MEM_Block_Mileage,此内存需在休眠唤醒后不丢失
 * @param[in] pInitData 从EEPROM读取上次下电前累计的里程
 * @param[in] pFunc 底层发送回调函数, 详见Mileage_Func_t
 *
 * @warning 此函数必须后于EEPROM初始化,因为要读取EEPROM数据,否则每次都是从0开始
 *
 * @since 1.0.0
 */
void Data_Mileage_KL30_Init(Millib_uint8_t *pMemSpace,
                            Mileage_Init_t *pInitData, Mileage_Func_t *pFunc);
/**
 * @brief 里程服务初始化,唤醒时调用,必须调用,否则造成空指针
 * @param[in] pMemSpace 内存空间,需要的空间大小至少大于Data_MEM_Block_Mileage,此内存需在休眠唤醒后不丢失
 * @param[in] pFunc 底层发送回调函数, 详见Mileage_Func_t
 *
 * @since 1.0.0
 */
void Data_Mileage_Wakeup_Init(Millib_uint8_t *pMemSpace, Mileage_Func_t *pFunc);
/**
 * @brief 里程累计服务,在100ms中断调用
 *
 * @since 1.0.0
 */
void Data_Mileage_ISR(void);
/**
 * @brief   里程读取
 * @return  当前累计里程数,单位100m
 * @warning 此数据非总计里程,总计里程属于此里程数的一部分
 *
 * @since 1.0.0
 */
Millib_uint32_t Data_Mileage_Read(void);

/**
 * @brief   里程读取
 * @return  当前累计里程数,单位mm
 * @warning 此数据非总计里程,总计里程属于此里程数的一部分
 *
 * @since 1.0.0
 */
Millib_uint32_t Data_Mileage_Readmm(void);

/**
 * @brief   写里程
 * @param[in] NewMileage 新里程数,单位100m
 * @return  成功 - 1 失败 - 0
 * @warning 调用此函数前,需要调用Data_Mileage_Clear函数
 *
 * @since 1.0.0
 */
Millib_uint8_t Data_Mileage_Write(Millib_uint32_t NewMileage);
/**
 * @brief   清里程,出厂时使用
 * @warning 此函数包含功能:清Mileage,清ODO以及清trip,调用此函数后,需要复位后,里程才会继续走动
 *
 * @since 1.0.0
 */
void Data_Mileage_Clear(void);
/**
 * @brief   清里程,出厂时使用
 * @warning 此函数包含功能:清Mileage,清ODO以及清Trip,调用此函数,不影响里程的走动
 *
 * @since 1.0.0
 */
void Data_Mileage_Clear_GoOn(void);
/**
 * @brief   将累计的里程存入EEPROM, 10ms任务中调用
 *
 * @since 1.0.0
 */
void Data_Mileage_Write_EEPROM(void);
/**
 * @brief   获取里程库软件版本号
 * @return  版本号 1.01
 * @since 1.0.0
 */
Millib_uint8_t *Get_Data_Mileage_Version(void);

/**
 * @brief 总计里程初始化,KL30调用,必须调用,否则造成空指针
 * @param[in] pMemSpace 内存空间,需要的空间大小至少大于Data_MEM_Block_ODO,此内存需在休眠唤醒后不丢失
 * @param[in] pInitData 详见ODO_Init_t
 * @param[in] Func 写EEPROM回调函数
 *
 * @warning 在Data_Mileage_KL30_Init之后调用
 *
 * @since 1.0.0
 */
void Data_ODO_KL30_Init(Millib_uint8_t *pMemSpace, ODO_Init_t *pInitData, EEPromWrite Func);
/**
 * @brief 总计里程初始化,唤醒调用,必须调用,否则造成空指针
 * @param[in] pMemSpace 内存空间,需要的空间大小至少大于Data_MEM_Block_ODO,此内存需在休眠唤醒后不丢失
 * @param[in] Func 写EEPROM回调函数
 *
 * @warning 在Data_Mileage_Wakeup_Init之后调用
 *
 * @since 1.0.0
 */
void Data_ODO_Wakeup_Init(Millib_uint8_t *pMemSpace, EEPromWrite Func);
/**
 * @brief 总计里程计算服务,为了其他服务获取总计里程无0.1m的偏差,需要此服务函数
 *
 * @warning 在100ms任务重调用
 *
 * @since 1.0.0
 */
void Data_ODO_Processing(void);
/**
 * @brief   总计里程读取
 * @return  当前总计里程数,单位100m
 * @warning 此数据为上次Data_ODO_Clear后,到调用此函数为止,累计的Mileage,属于Mileage的一部分
 *
 * @since 1.0.0
 */
Millib_uint32_t Data_ODO_Read(void);

/**
 * @brief   清总计里程,车厂使用
 * @warning 此函数只是将总计里程的里程戳标记为当前的Mileage,不属于完全清除,如出厂请调用Data_Mileage_Clear
 *
 * @since 1.0.0
 */
void Data_ODO_Clear(void);

/**
 * @brief   总计里程偏移量读取
 * @return  当前偏移量,单位100m
 * @warning 里程备份时使用
 *
 * @since 1.0.0
 */
Millib_uint32_t Data_Offset_Read(void);

/**
 * @brief   总计里程偏移量修改
 * @return  当前偏移量,单位100m
 * @warning 里程备份时使用
 *
 * @since 1.0.0
 */
void Data_ODO_Modify(Millib_uint32_t Offset);

/**
 * @brief 发动机总计里程初始化,KL30调用,必须调用,否则造成空指针
 * @param[in] pMemSpace 内存空间,需要的空间大小至少大于Data_MEM_Block_EngODO,此内存需在休眠唤醒后不丢失
 * @param[in] pInitData 详见EngODO_Init_t
 * @param[in] pFunc1 累计发动机总里程的条件
 * @param[in] pFunc2 写EEPROM回调函数
 *
 * @warning 在Data_Mileage_KL30_Init之后调用
 *
 * @since 1.0.0
 */
void Data_EngODO_KL30_Init(Millib_uint8_t *pMemSpace, EngODO_Init_t *pInitData, GetRunValid pFunc1, EEPromWrite pFunc2);

/**
 * @brief 发动机总计里程初始化,唤醒调用,必须调用,否则造成空指针
 * @param[in] pMemSpace 内存空间,需要的空间大小至少大于Data_MEM_Block_EngODO,此内存需在休眠唤醒后不丢失
 * @param[in] pFunc1 累计发动机总里程的条件
 * @param[in] pFunc2 写EEPROM回调函数
 *
 * @warning 在Data_Mileage_Wakeup_Init之后调用
 *
 * @since 1.0.0
 */
void Data_EngODO_Wakeup_Init(Millib_uint8_t *pMemSpace, GetRunValid pFunc1, EEPromWrite pFunc2);
/**
 * @brief 发动机总计里程计算服务,为了其他服务获取总计里程无0.1m的偏差,需要此服务函数
 *
 * @warning 在100ms任务重调用
 *
 * @since 1.0.0
 */
void Data_EngODO_Processing(void);

/**
 * @brief   发动机总计里程读取
 * @return  当前总计里程数,单位100m
 * @warning 此数据为上次Data_ODO_Clear后,到调用此函数为止,累计的Mileage,属于Mileage的一部分
 *
 * @since 1.0.0
 */
Millib_uint32_t Data_EngODO_Read(void);

/**
 * @brief   发动机总计里程写
 * @return  当前发动机总计里程数,单位100m
 * @warning 此数据为上次Data_EngODO_Clear后,累计的Mileage
 *
 * @since 1.0.0
 */
void Data_EngODO_Write(Millib_uint32_t newEngODO);

/**
 * @brief   清发动机总计里程,车厂使用
 * @warning 此函数只是将发送机总计里程清除,如需工厂清除,需要调用Data_Mileage_Clear
 *
 * @since 1.0.0
 */
void Data_EngODO_Clear(void);

/**
 * @brief 小计里程初始化,KL30调用,必须调用,否则造成空指针
 * @param[in] pMemSpace 内存空间,需要的空间大小至少大于Data_MEM_Block_Trip*EM_TRIP_MAX,此内存需在休眠唤醒后不丢失
 * @param[in] pInitData Trip_Init_t
 * @param[in] TotalTrip 小计总数,(例如:1个小计, 2个小计,3个小计)
 * @param[in] Func 写EEPROM回调函数
 *
 * @warning 在Data_Mileage_KL30_Init之后调用
 *
 * @since 1.0.0
 */
void Data_Trip_KL30_Init(Millib_uint8_t *pMemSpace, Trip_Init_t *pInitData, Millib_uint8_t TotalTrip, EEPromWrite pFunc);
/**
 * @brief 小计里程初始化,唤醒调用,必须调用,否则造成空指针
 * @param[in] pMemSpace 内存空间,需要的空间大小至少大于Data_MEM_Block_Trip*EM_TRIP_MAX,此内存需在休眠唤醒后不丢失
 * @param[in] TotalTrip 小计总数,(例如:1个小计, 2个小计,3个小计)
 * @param[in] Func 写EEPROM回调函数
 *
 * @warning 在Data_Mileage_Wakeup_Init之后调用
 *
 * @since 1.0.0
 */
void Data_Trip_Wakeup_Init(Millib_uint8_t *pMemSpace, Millib_uint8_t TotalTrip, EEPromWrite pFunc);
/**
 * @brief 小计里程计算服务,为了其他服务获取小计里程无0.1m的偏差,需要此服务函数
 *
 * @warning 在100ms任务重调用
 *
 * @since 1.0.0
 */
void Data_Trip_Processing(void);
/**
 * @brief   清小计里程
 * @param[in] TripN DataTripEnum_t
 * @warning 此函数只是将小计里程的里程戳标记为当前的Mileage,不属于完全清除,如出厂请调用Data_Mileage_Clear
 *
 * @since 1.0.0
 */
void Data_Clear_Trip(DataTripEnum_t TripN);
/**
 * @brief   清小计里程
 * @warning 此函数只是将小计里程的里程戳标记为当前的Mileage,不属于完全清除,如出厂请调用Data_Mileage_Clear
 *
 * @since 1.0.0
 */
void Data_Clear_Trip_All(void);
/**
 * @brief   小计里程读取
 * @param[in] TripN DataTripEnum_t
 * @return  当前小计里程数,单位100m
 * @warning 此数据为上次Data_ODO_Clear后,到调用此函数为止,累计的Mileage,属于Mileage的一部分
 *
 * @since 1.0.0
 */
Millib_uint32_t Data_Read_Trip(DataTripEnum_t TripN);

/**
 * @brief   设置小计里程
 * @param[in] TripN DataTripEnum_t
 * @param[in] NewMileage 设置的里程数
 * @return  1 - 成功/ 0 - 失败
 * @warning 设置后会存储EEPROM
 *
 * @since 1.0.0
 */
Millib_uint8_t Data_Write_Trip(DataTripEnum_t TripN, Millib_uint32_t NewMileage);

#endif