#include "./inc/includes.h"

// APP软件两种加载模式（MAIN_APP_LOAD_MODE_DEFAULT和MAIN_APP_LOAD_MODE_BOOTLOADER）
static uint8 gMain_byAppLoadMode = MAIN_APP_LOAD_MODE_BOOTLOADER;

// 主函数入口
int main(void)
{
    main_app_start(gMain_byAppLoadMode);

    return 1;
}

// 主程序启动
// 启动地址:0x08080000,区块大小256K(0x40000)
uint8 main_app_start(uint8 byDebugMode)
{
    uint8 byFlag = 0;

    // 若APP由bootloader负责加载
    if (byDebugMode == MAIN_APP_LOAD_MODE_BOOTLOADER)
    {
        SCB->VTOR = FLASH_BASE | 0x80000; // 中断向量偏移512KB
        OPEN_INT();                       // 打开总中断
    }

    // 系统初始化
    byFlag = main_init();
    if (!byFlag) // 初始化失败
    {
        error_switch_red_led(1); // 点亮红灯
        return 0;                // 系统退出
    }
    else // 初始化成功
    {
        error_switch_green_led(1); // 点亮绿灯
    }

    while (1)
    {
        // 定时器服务处理接口
        timer_process_func(NULL);

        // 本地网管服务处理接口
        gui_process_func(NULL);

        // 网管中心服务处理接口
        nmc_process_func(NULL);

        // 同步模块后向处理
        syncback_process_func(NULL);
    }

    return 1;
}

// 驱动初始
uint8 main_driver_init()
{
    uint8 byFlag = 0;

    // 初始化用户时钟
    sysrcc_config_user_clk();

    // 初始化CPLD模块
    driver_cpld_init();

    // 初始化延时定时器
    driver_delay_init();

    // 初始化状态灯
    driver_led_gpio_init();

    // 初始化4号定时器，为应用层提供时基
    driver_timer_timer3_init();

    // 初始化串口
    driver_uart_init();
    driver_debug_init(); // 初始化调试模块
    driver_wifi_init();  // 初始化wifi模块(使用串口通信)
    driver_gui_init();   // 初始化gui模块(使用串口通信)

    // 同步模块SPI接口初始化
    driver_syncspi_init();

    // cpu flash初始化
    driverapp_cpuflash_init();

    // rtc初始化
    driver_rtci2c_init();
    byFlag = driverapp_rtc_init();
    if (!byFlag)
    {
        rtc_set_chip_flag(0); // 修改芯片存在标识符
        char *pError = "rtc init fail\r\n";
        driver_gui_send_data(pError, (uint16)SYS_STRLEN(pError));
    }

    return 1;
}

// 应用层初始化
uint8 main_app_init()
{
    uint8 byFlag = 0;
    uint8 byCarrierId = 0;
    uint8 byCarrierGap = 0;

    // 协议栈两个模块
    ps_init();  // 初始化协议栈模块
    wmm_init(); // 初始化网管参数模块

    byFlag = sync_init(); // 初始化同步模块
    if (!byFlag)
    {
        char *pError = "sync init fail\r\n";
        driver_gui_send_data(pError, (uint16)SYS_STRLEN(pError));
        return byFlag;
    }

    // 初始化系统参数模块(该模块中会用到协议栈相关的数据结构，所以要放到协议栈模块后面初始化)
    byFlag = sysparam_init();
    if (!byFlag)
    {
        char *pError = "sysparam init fail\r\n";
        driver_gui_send_data(pError, (uint16)SYS_STRLEN(pError));
        return byFlag;
    }

    timer_init(); // 初始化定时器模块

    byFlag = wifi_ble_init(); // wifi蓝牙模块初始化
    if (!byFlag)
    {
        char *pError = "wifi ble init fail\r\n";
        driver_gui_send_data(pError, (uint16)SYS_STRLEN(pError));
        return byFlag;
    }

    gui_init(); // 初始化本地网管模块

    nmc_init(); // 初始化集中网管模块

    monitor_init(); // 初始化系统监听模块

    driver_cpld_cs_enable(1); // 使能cpld模块

    exti_init(); // 启动外部中断

    return 1;
}

// 系统初始化
uint8 main_init()
{
    uint8 byFlag = 0;

    // 设置优先级分组（2组抢占优先级，2组响应优先级）
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    // 驱动初始化
    byFlag = main_driver_init();
    if (!byFlag)
    {
        return 0;
    }

    // 延迟1秒
    driver_delay_nxs(1);

    // 应用层初始化
    byFlag = main_app_init();
    if (!byFlag)
    {
        return 0;
    }

    return 1;
}
