Files

139 lines
4.0 KiB
C

/**
* @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 */