static char g_download_file_path[512] = {0}; /* 下载文件路径 */
static uint32_t g_total_received_bytes = 0; /* 总接收字节数 */
static uint32_t g_total_received_packets = 0; /* 总接收包数 */
+static http_file_download_data_callback_t g_external_data_callback = NULL; /* 外部数据回调函数 */
/* 前向声明 */
extern void udp_send_msg_toCat1(uint8_t cmd, char *content);
cat1_print_info("HTTP download: Packet #%u, data_len=%u, total_bytes=%u (file not open)\n",
packet_num, data_len, g_total_received_bytes);
}
+
+ // 调用外部注册的回调函数(如果已注册)
+ if (g_external_data_callback != NULL) {
+ int ret = g_external_data_callback(data, data_len, packet_num);
+ if (ret != 0) {
+ cat1_print_err("HTTP download: External callback returned error: %d\n", ret);
+ return ret;
+ }
+ }
if(data_len!=SPI_PACKET_DATA_SIZE)
{
/**
* @brief 初始化HTTP文件下载服务
+ * @param callback 外部数据回调函数指针,NULL表示不使用外部回调
* @return 0成功,-1失败
*/
-int http_file_download_init(void)
+int http_file_download_init(http_file_download_data_callback_t callback)
{
cat1_print_info("HTTP file download service: Initializing...\n");
// 检查是否已经初始化
if (g_download_complete_sem != NULL) {
cat1_print_warning("HTTP file download service: Already initialized\n");
+ // 如果已经初始化,仍然可以更新回调函数
+ if (callback != NULL) {
+ g_external_data_callback = callback;
+ cat1_print_info("HTTP file download service: External callback updated\n");
+ }
return 0;
}
+ // 保存外部回调函数
+ g_external_data_callback = callback;
+ if (callback != NULL) {
+ cat1_print_info("HTTP file download service: External callback registered\n");
+ }
+
// 创建下载完成信号量(初始值为0,用于阻塞等待)
g_download_complete_sem = osSemaphoreNew(1, 0, NULL);
if (g_download_complete_sem == NULL) {
g_download_state = HTTP_DOWNLOAD_STATE_IDLE;
g_total_received_bytes = 0;
g_total_received_packets = 0;
+ g_external_data_callback = NULL; /* 清除外部回调函数 */
cat1_print_info("HTTP file download service: Deinitialized successfully\n");
}
HTTP_DOWNLOAD_STATE_ERROR /* 下载错误 */
} http_download_state_t;
+/* 外部数据回调函数类型 */
+/**
+ * @brief HTTP下载数据接收回调函数类型
+ * @param data 接收到的数据指针(不包含包头,仅数据部分)
+ * @param data_len 数据长度(从包头解析得到)
+ * @param packet_num 包序号(从1开始递增)
+ * @return 0表示成功,非0表示失败
+ */
+typedef int (*http_file_download_data_callback_t)(const uint8_t *data, uint32_t data_len, uint32_t packet_num);
+
/**
* @brief 初始化HTTP文件下载服务
+ * @param callback 外部数据回调函数指针,NULL表示不使用外部回调
* @return 0成功,-1失败
*/
-int http_file_download_init(void);
+int http_file_download_init(http_file_download_data_callback_t callback);
/**
* @brief 反初始化HTTP文件下载服务