/***************************************************************************** * @file PathStorage.h * @brief 路径文件存储模块 - 负责从HTTP下载路径文件并存储到FLASH * @author AI Assistant * @date 2025-12-19 *****************************************************************************/ #ifndef __PATH_STORAGE_H__ #define __PATH_STORAGE_H__ #include "HIDO_TypeDef.h" #ifdef __cplusplus extern "C" { #endif /***************************************************************************** * 宏定义 *****************************************************************************/ // FLASH存储地址定义(Bank1 Sector4起始) #define PATH_STORAGE_BASE_ADDR 0x08080000U // 起始地址 #define PATH_STORAGE_MAX_SIZE (512 * 1024) // 最大512KB // 路径文件头魔数(小端存储:文件字节序0x55 0xAA,读为uint16_t得0xAA55) #define PATH_FILE_SOF 0xAA55 // 帧头标识(小端) #define PATH_FILE_TYPE 0x3C // 类型标识 #define PATH_FILE_VERSION 0x10 // 版本号 /***************************************************************************** * 数据结构定义 *****************************************************************************/ #pragma pack(push, 1) // 确保编译器不自行插入任何对齐字节 /** * @brief 割草机路径文件头结构(按照协议文档定义) */ typedef struct { // 基础信息 (Offset 0-11) HIDO_UINT16 sof; // 帧头 0x55AA HIDO_UINT8 type; // 类型 0x3C HIDO_UINT8 version; // 版本 0x10 HIDO_UINT32 path_id; // 路径ID HIDO_UINT32 timestamp; // 时间戳 // 保留与高精度数据 (Offset 12-35) HIDO_UINT32 reserved; // 4字节保留位 HIDO_DOUBLE origin_lon; // 原点经度 (8字节,16字节偏移对齐) HIDO_DOUBLE origin_lat; // 原点纬度 (8字节) HIDO_FLOAT origin_alt; // 原点高度 (4字节) // 数量信息 (Offset 36-39) HIDO_UINT16 boundary_count; // 外边框点数 HIDO_UINT16 path_count; // 路径点数 // 之后紧跟坐标数据:boundary_count个边界点 + path_count个路径点 // 每个点:float x, float y(8字节) } MowerPathHeader_t; #pragma pack(pop) /** * @brief 路径点坐标结构 */ typedef struct { HIDO_FLOAT x; // X坐标,单位:米 HIDO_FLOAT y; // Y坐标,单位:米 } PathPoint_t; /** * @brief 路径存储状态 */ typedef enum { PATH_STORAGE_STATUS_IDLE = 0, // 空闲 PATH_STORAGE_STATUS_DOWNLOADING, // 下载中 PATH_STORAGE_STATUS_WRITING, // 写入中 PATH_STORAGE_STATUS_SUCCESS, // 成功 PATH_STORAGE_STATUS_FAIL_NETWORK, // 网络失败 PATH_STORAGE_STATUS_FAIL_FLASH, // FLASH写入失败 PATH_STORAGE_STATUS_FAIL_CRC, // CRC校验失败 PATH_STORAGE_STATUS_FAIL_FORMAT // 格式错误 } E_PathStorageStatus; /***************************************************************************** * 函数声明 *****************************************************************************/ /** * @brief 初始化路径存储模块 * @return 0=成功, <0=失败 */ HIDO_INT32 PathStorage_Init(void); /** * @brief 从HTTP下载路径文件并存储到FLASH * @param url HTTP下载URL * @return 0=成功启动下载, <0=失败 */ HIDO_INT32 PathStorage_DownloadFromHTTP(const HIDO_CHAR *url); /** * @brief 从FLASH读取路径文件头 * @param header 输出路径文件头结构 * @return 0=成功, <0=失败 */ HIDO_INT32 PathStorage_ReadHeader(MowerPathHeader_t *header); /** * @brief 从FLASH读取指定的路径点数据 * @param is_boundary 是否读取边界点(否则读取路径点) * @param index 点索引(从0开始) * @param point 输出点坐标 * @return 0=成功, <0=失败 */ HIDO_INT32 PathStorage_ReadPoint(HIDO_BOOL is_boundary, HIDO_UINT32 index, PathPoint_t *point); /** * @brief 批量读取路径点数据 * @param is_boundary 是否读取边界点(否则读取路径点) * @param start_index 起始索引 * @param count 读取数量 * @param points 输出点数组 * @return 实际读取的点数, <0=失败 */ HIDO_INT32 PathStorage_ReadPoints(HIDO_BOOL is_boundary, HIDO_UINT32 start_index, HIDO_UINT32 count, PathPoint_t *points); /** * @brief 获取当前存储状态 * @return 路径存储状态 */ E_PathStorageStatus PathStorage_GetStatus(void); /** * @brief 获取下载进度(0-100) * @return 下载进度百分比 */ HIDO_UINT8 PathStorage_GetProgress(void); /** * @brief 擦除FLASH中的路径数据 * @return 0=成功, <0=失败 */ HIDO_INT32 PathStorage_Erase(void); /** * @brief 验证FLASH中路径文件的CRC32 * @return 0=校验通过, <0=校验失败 */ HIDO_INT32 PathStorage_VerifyCRC32(void); #ifdef __cplusplus } #endif #endif /* __PATH_STORAGE_H__ */