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