/** * @file unsettled_order_mng.h * @brief 未结算订单索引列表(EEPROM 持久化) * * 与充电订单 Flash 模块配合:订单保存成功后可将 `u32_index` 加入本列表;平台确认结算后移除。 * 数据区独立 EEPROM 段,结构含头、计数、CRC 与 3 字节压缩索引表,详见 `S_UNSETTLED_ORDER_MNG`。 */ #ifndef UNSETTLED_ORDER_MNG_H #define UNSETTLED_ORDER_MNG_H #ifdef __cplusplus /*C++编译环境下兼容C语言*/ extern "C" { #endif /*------ Exported includes(头文件) ----------------------*/ #include "main.h" #include "eeprom/fm24cl16.h" /*------ Exported macro(宏定义) -------------------------*/ // 最大未结算订单数(基于可用空间计算) // 地址范围:0x0040 - 0x00FF = 192字节 // 结构体大小:头标志(2) + 计数(2) + CRC(2) = 6字节 // 剩余空间:192 - 6 = 186字节 // 每个索引使用3字节压缩存储(支持最大索引值16,777,215) // 最大存储数量:186 / 3 = 62个(向下取整) // 用户要求最大数量为60,满足要求 #define UNSETTLED_MAX_CNT 30 // 最大未结算订单数 // 头标志定义 #define UNSETTLED_HEADER 0x5AA6 // 未结算订单管理信息头标志 // CRC多项式(简单校验) #define UNSETTLED_CRC_POLY 0x1021 // CRC-16-CCITT多项式 /*------ Exported struct(结构体定义) --------------------*/ /** * @brief 未结算订单管理信息结构体 * * 存储在EEPROM地址:EEPROM_ADDR_UNSETTLED_MNG (0x0040) * 用于管理未结算订单的索引列表 * 使用3字节压缩存储索引,支持最大60个未结算订单 */ typedef struct { U16_T u16_head; // 头标志 (0x5AA6) U16_T u16_unsettledCnt; // 未结算订单数量 U16_T u16_crc; // CRC校验值 U8_T u8_unsettledIndexes[UNSETTLED_MAX_CNT][3]; // 未结算订单索引数组(每个索引3字节) } S_UNSETTLED_ORDER_MNG; /*------ Exported variables(变量定义) -------------------*/ // 未结算订单管理信息全局变量 extern S_UNSETTLED_ORDER_MNG s_unsettledOrderMng; /*------ Exported function prototypes (函数声明) -------*/ /** * @brief 初始化未结算订单管理模块 * * 从EEPROM读取管理信息,如果不存在则初始化默认值 * 验证数据完整性(CRC校验) */ void v_unsettled_order_init(void); /** * @brief 添加未结算订单索引 * * 当新的充电订单保存到Flash时调用此函数 * * @param orderIndex 订单索引(由u32_chg_order_save_record返回) * @return U8_T 添加结果:0-成功,1-失败(列表已满) */ U8_T u8_add_unsettled_order(U32_T orderIndex); /** * @brief 移除已结算订单索引 * * 当平台确认结算后调用此函数 * * @param orderIndex 要移除的订单索引 * @return U8_T 移除结果:0-成功,1-失败(未找到该索引) */ U8_T u8_remove_unsettled_order(U32_T orderIndex); /** * @brief 检查订单是否已结算 * * @param orderIndex 要检查的订单索引 * @return U8_T 检查结果:0-已结算,1-未结算 */ U8_T u8_check_order_settled(U32_T orderIndex); /** * @brief 获取未结算订单数量 * * @return U16_T 未结算订单数量 */ U16_T u16_get_unsettled_order_count(void); /** * @brief 获取所有未结算订单索引 * * @param indexArray 索引数组指针(用于存储读取到的数据) * @param count 实际读取到的索引数量指针 */ void v_get_unsettled_order_indexes(U32_T *indexArray, U16_T *count); /** * @brief 清除所有未结算订单记录 * * 用于系统重置或测试 */ void v_clear_all_unsettled_orders(void); /** * @brief 打印未结算订单状态(调试用) */ void v_print_unsettled_order_status(void); /** * @brief 计算CRC校验值 * * @param data 数据指针 * @param length 数据长度(字节) * @return U16_T CRC校验值 */ U16_T u16_calculate_crc(const U8_T *data, U16_T length); #ifdef __cplusplus } #endif #endif /* UNSETTLED_ORDER_MNG_H */