#include "app.h"
#include "app_timer.h"
#include "app_leakage.h"

#include "stdio.h"
#include "string.h"

#include "bsp_Uart.h"
#include "bsp_Wdg.h"
#include "bsp_Led.h"
#include "bsp_Flash.h"
#include "bsp_W5500.h"
#include "bsp_w25q.h"
#include "bsp_DS1302.h"
#include "bsp_relay.h"
#include "bsp_buzzer.h"



#include "proto_modbus_master_leakage.h"
#include "proto_modbus_tcp_slave_ex.h"

#include "gui_tjc_hmi.h"

const char *HwVersion = "V2.0";
char SwVersion[24] = "V0.005.0";
void task_idle(void); 
void task_10ms(void);
void task_50ms(void);
void task_100ms(void);
void task_200ms(void);
void task_500ms(void);
void task_1s(void);
void task_2s(void);

#define APP_TIMER_TASK_NUM (sizeof(app_timer_task) / sizeof(app_timer_class_t))

/*定义任务*/
app_timer_class_t app_timer_task[] = 
{
    {0,  1,   1,    task_idle  },   /*空闲任务一直执行*/
    {0,  3,   10,   task_10ms  },
    {0,  7,   50,   task_50ms  },
    {0,  11,  100,  task_100ms },
    {0,  13,  200,  task_200ms },
    {0,  17,  500,  task_500ms },
    {0,  19,  1000, task_1s    },
    {0,  23,  2000, task_2s    },
};

/******************************************
 * 函数: AppInit
 * 功能: 初始化
 * 参数: 无
 * 返回: 无
 * 描述: 无
 ******************************************/
void app_init(void)
{
   Wdg.Init();
    /*flash*/
    w25q32.init();
    Wdg.Feed();
//    HAL_Delay(5000);
    
    /*串口初始化*/
    com_uart1.init(&com_uart1);
    com_uart2.init(&com_uart2);
    com_uart3.init(&com_uart3);
    com_uart4.init(&com_uart4);
    com_uart6.init(&com_uart6);
    Wdg.Feed();
    /*网口*/
    W5500.Init();
    Wdg.Feed();
    /*屏幕通讯*/
    tjc_hmi.init();
    
    /*modbus协议*/
    modbus_slave_ex.init();
    
    /*子系统*/
    modbus_leakage[APP_COM1].init(&modbus_leakage[APP_COM1]);
    modbus_leakage[APP_COM2].init(&modbus_leakage[APP_COM2]);
    modbus_leakage[APP_COM3].init(&modbus_leakage[APP_COM3]);
    modbus_leakage[APP_COM4].init(&modbus_leakage[APP_COM4]);

    /*外设*/
    DS1302.Init();
    relay.init();
    buzzer.init();
    led.init();
    leakage.init();
    /*com口绑定*/
    app_com.init();
    history.init_history();
    
    /*分时复用，时间片轮询*/
    app_timer.init(APP_TIMER_TASK_NUM,app_timer_task);

}

/******************************************
 * 函数: App_task
 * 功能: 分时复用
 * 参数: 无
 * 返回: 无
 * 描述: 主循环中调用
 ******************************************/
void app_task(void)
{
    app_timer.task();
    task_idle(); 
//    W5500.Task();
}
/*空闲执行的函数*/
void task_idle(void)
{
    com_uart1.rx_task(&com_uart1);
    com_uart2.rx_task(&com_uart2);
    com_uart3.rx_task(&com_uart3);
    com_uart4.rx_task(&com_uart4);
    com_uart6.rx_task(&com_uart6);
    W5500.Task();
    Wdg.Feed();
}

void task_10ms(void)
{
}

void task_50ms(void)
{

}

void task_100ms(void)
{

}

void task_200ms(void)
{
    
}

void task_500ms(void)
{
    led.task();
    modbus_leakage[APP_COM1].tx_task(&modbus_leakage[APP_COM1]);
    modbus_leakage[APP_COM2].tx_task(&modbus_leakage[APP_COM2]);
    modbus_leakage[APP_COM3].tx_task(&modbus_leakage[APP_COM3]);
    modbus_leakage[APP_COM4].tx_task(&modbus_leakage[APP_COM4]);
}
    
void task_1s(void)
{
    leakage.task();
    DS1302.Task();
    buzzer.task();
    relay.task();
    W5500.Monitor_task();
}

void task_2s(void)
{
    
}

