/*
 * 模块名称：Network Application Task
 * 模块功能：CH395F 协议栈初始化 + 轮询 + TCP/UDP 业务处理
 *          与 net_socket.h 配合，在 FreeRTOS 独立任务中运行
 * 适用平台：STM32F407ZGTx + CH395F
 * 作者：王建锋
 * 创建日期：2026-07-19
 * 修改记录：
 *   v1.0  2026-07-19  王建锋  创建初始版本
 *   v1.1  2026-07-19  王建锋  migrate from freertos.c StartNetTask
 *   v1.2  2026-07-21  王建锋  网络初始化移入本任务（net_init + TCP 监听）
 *   v1.3  2026-07-22  王建锋  单连接模式重构，增加大文件/边界/KeepAlive 测试
 */

#include <string.h>
#include "net_task.h"
#include "cmsis_os.h"
#include "net_socket.h"
#include "net_select.h"
#include "ch395f.h"

#define DBG_TAG "[NET_TASK]"
#include "dbg_log.h"

/* 网络初始化完成标志（供 ch395f_test_task 等外部任务等待） */
volatile uint8_t g_net_ready = 0;

/*
 * 函数功能：CH395F 协议栈一次性初始化（两种构建模式共用）
 * 入口参数：无
 * 返 回 值：0 - 成功，-1 - 失败
 * 函数说明：net_init → MAC 打印 → PHY 强制 100M 全双工 → 置 g_net_ready。
 *          NET 层模式由 netTask 调用；硬件层模式（阶段 1~5）netTask 不创建，
 *          由 ch395fTestTask 调用后独占 CH395F。
 */
int net_stack_bring_up(void)
{
    DBG_INFO("=== Network Init ===");

    if (net_init("192.168.1.100", "255.255.255.0", "192.168.1.1") != 0) {
        DBG_ERROR("net init: FAIL");
        return -1;
    }
    DBG_INFO("net init: OK");

    uint8_t mac[6];
    ch395f_get_mac_addr(mac);
    DBG_INFO("MAC: %02X:%02X:%02X:%02X:%02X:%02X",
             mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

    ch395f_set_phy(CH395F_PHY_100M_FULL);
    HAL_Delay(3000);
    uint8_t phy = ch395f_get_phy_status();
    DBG_INFO("PHY: %s",
             (phy == CH395F_PHY_100M_FULL) ? "100M FULL" :
             (phy == CH395F_PHY_100M_HALF) ? "100M HALF" :
             (phy == CH395F_PHY_10M_FULL)  ? "10M FULL"  :
             (phy == CH395F_PHY_10M_HALF)  ? "10M HALF"  :
             (phy == CH395F_PHY_DISCONN)   ? "DISCONNECT" : "UNKNOWN");

    g_net_ready = 1;
    return 0;
}

/*
 * 函数功能：网络任务初始化
 * 入口参数：无
 * 返 回 值：0 - 成功，-1 - 失败
 * 限定条件：CH395F 协议栈已初始化
 * 函数说明：创建 TCP Server 监听 Socket，注册回调等
 */
int net_task_init(void)
{
    DBG_INFO("net_task_init");
    return 0;
}

/*
 * 函数功能：网络任务主函数
 * 入口参数：arg - FreeRTOS 传入参数（未使用）
 * 返 回 值：无
 * 函数说明：启动后先调用 net_stack_bring_up() 初始化 CH395F 协议栈，
 *          再进入轮询循环处理网络事件。
 *          仅 NET 层测试模式（阶段 6~10）会创建本任务；
 *          硬件层模式下 netTask 不创建，CH395F 由 ch395fTestTask 独占。
 */
void net_task_func(void const *arg)
{
    (void)arg;

    osDelay(2000);

    if (net_stack_bring_up() != 0) {
        for (;;) {
            osDelay(1000);
        }
    }

    DBG_INFO("netTask: started (single-socket mode)");

    /* ==================== 主轮询循环 ==================== */
    for (;;) {
        net_poll();
        net_process_messages();
        osDelay(10);
    }
}
