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