#include "sr_app_cloud.h"

#include "hci/led/app/sr_app_led.h"

//#include "sr_app_lp.h"

#include "sr_gpio.h"
#include "sr_uart.h"


#if   0

typedef struct CLD_MNG
{
    SR_NETDEV_T *netdev;
    	
	uint8_t netdevState;   /*网卡状态*/

}CLD_MNG_T;

static CLD_MNG_T gsCldMng;

static void _Upload_Event_Deal(void);



int SR_SvcNetdevUserAtInit(SR_NETDEV_T *dev,)
{
	SR_GET_CT();
	_STACK_T *stack = (_STACK_T *)SR_ALLOC_STACK(ct,sizeof(_STACK_T));
	uint16_t cmdNum = sizeof(atInitTable)/sizeof(AT_INIT_TABLE_T);
	AT_DEVICE_T *atDev = (AT_DEVICE_T *)dev->atDev;

	int ret=SR_OK;


	SR_CT_BEGIN();

    // 2.按网络初始化AT列表依次发送
    //while (pNbCore->cmd_index < pNbCore->cmd_num)
    for(stack->i=0; stack->i<cmdNum; stack->i++)
    {		
        // 串口打印发送内容
        SR_LOG(DEBUG, "send cmd:%s", atInitTable[stack->i].sendCmd);

        //发送AT命令，内部处理重发，并调用回调函数
        ret = SR_AtResendCmdwithCb(&atDev->atClient, atDev->resp, atInitTable[stack->i].cb,atInitTable[stack->i].timeout,atInitTable[stack->i].resendCnt, (const char *)atInitTable[stack->i].sendCmd);

        if(ret != SR_OK) break;
        
    }

	return ret;

	SR_CT_END();
}

#endif


void SR_AppNetdevHwInit(void)
{
  SR_DEVICE_T *dev=SR_NULL;
  // GPIO初始化
  SR_GPIO_CFG_T gpioCfg={0};
  gpioCfg.gpioMode = SR_GPIO_OUTPUT;  //推挽输出
  gpioCfg.pull = SR_GPIO_NP;          //无上下拉   
  gpioCfg.altFun = SR_GPIO_NOAF;      //无复用
  gpioCfg.initLvl = SR_GPIO_LOW;      //初始电平  低
  SR_HalGpioInit(NETDEV_POWER_GPIO_ID,&gpioCfg);  //电源脚
  SR_HalGpioInit(NETDEV_RESET_GPIO_ID,&gpioCfg);  //复位脚


  //串口初始化
  SR_UART_CFG_T config = SR_UART_CFG_DEFAULT; // 初始默认配置
  config.baudrate = SR_UART_BAUD_9600;
  config.dataBits = SR_UART_DATA_BIT_8;
  config.parity = SR_UART_PARITY_NONE;
  config.stopBits = SR_UART_STOP_BIT_1;
  config.rxBufsz = 0;  //不分配接收缓存，保持上次的，

  dev = SR_HalUartOpen(NETDEV_UART_ID);

  SR_HalUartConfig(dev, &config);
}


#if   0

void SR_AppNetdevHwReset(void)
{
    // 硬件复位
	Svc_Nb_Core_Reset();
}




static void _UserCtwEvtCb(CTW_EVT_E evt,uint8_t *data,uint16_t dLen, void *args)
{

	switch(evt)
	{
		case CTW_EVT_RECV:
		SR_LOG(INFO, "[CTW] recv data:%*s", dLen,data);


		break;
	}

}

//云模块初始化
int SR_AppCldInit(void)
{

    //1、内部数据初始化
    Svc_Cloud_Init();

    //2、网卡初始化
    //2.1 硬件初始化
    gsCldMng.netdevState = NETDEV_STA_OFF;
    SR_AppNetdevHwInit(); 
    

    //2.2 注册网卡事件回调函数
    // 查找网卡
	gsCldMng.netdev = SR_NetdevFind("lmb26");
	if (gsCldMng.netdev == SR_NULL)
	{
		SR_LOG(ERR, "netdev not found");
		return -1;
	}
	SR_LOG(INFO, "find netdev: lmb26");

    //3、CTWING云初始化
	CTW_AT_INIT_T init={.srvIp = CTW_SERVER_IP,.srvPort = CTW_SERVER_PORT};
	SR_CtwAtInit("lmb26", &init);

	//注册事件通知用于接收
	SR_CtwAtSetEvtCb(gsCldMng.netdev,_UserCtwEvtCb,SR_NULL);

    //2.2 初始化AT列表


    //3、创建任务

    return 0;
}



//云模块轮询任务
void SR_AppCldPollTask(void)
{
    Bsp_Iwdg_Feed();
    //_Upload_Event_Deal();//上报事件处理
    Bsp_Iwdg_Feed();
    Svc_Cloud_Check_Timing_Event();//检查定时事件
    // Svc_Lp_Sleep(); 
	// Svc_Wdg_Feed(1);	
    Bsp_Iwdg_Feed();//喂狗<<
	//更新当前时间 系统时间在整个程序只能一个更新
    //否则会出现小时的23:59:59这时小时数据没有更新,
    //到日处理等时时间更新成00:00:00,这样日数据最后个时冻结数据漏存
    Svc_Cloud_Refresh_Time();     
}

//数据发送处理任务
SR_THD_RET SR_AppCldDataProcTask(void *args)
{

    SR_GET_CT(); // 获取当前上下文
	int ret;


    SR_CT_BEGIN(); // 上下文环境起始

    //网卡的网络初始化
    SR_AppNetdevHwReset();  //硬件复位
    //网络使能
    ret = SR_HalNetSwitch(gsCldMng.netdev, 0, SR_NET_OPEN);
	if (ret != SR_OK)
	{
		SR_LOG(INFO, "net enable fail,ret(%d)", ret);
	}
	else
	{
		SR_LOG(INFO, "net enable OK", ret);
	}

    //用户AT命令初始化


    //云连接


    //检查事件和网络状况

    //LED设置

    //组装数据发送

    //发送失败处理数据
     
    SR_CT_END(); // 上下文环境结束
}

/**
 * @brief: 上报事件处理
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
static void _Upload_Event_Deal(void){
    E_Cloud_Event e_event=E_Cloud_Event_No;
    e_event=Svc_Cloud_Get_Pending_Event();    //获取处于等待处理的最高优先级事件
    if(Svc_Nb_Core_Get_Cur_State()!=E_NB_RUN){//等待NB联网
        return;
    }
    if(Svc_Cloud_Event_Is_Changed(e_event)==E_CHECK_FAIL){ //事件未改变，不需要重新触发
        return;
    }  
	SR_AppLedSetWork(LED_NB_NET_INIT);
	SR_AppLedClearWork(LED_NB_NET_ERR);
    switch (e_event)
    {
        case E_Cloud_Event_Rsp_Set:
            Svc_Cloud_Lock_Event(E_Cloud_Event_Rsp_Set);//锁定当前云事件数据上报
            Svc_Cloud_Protocol_Reply_Set_Para();        //设置终端参数返回命令生成	
            #if LOG_FUNC_ENABLE 
                Svc_Log_Printf(LOG_INFO,"%s-> E_Cloud_Event_Rsp_Set ENTER THIS PLACE",__FUNCTION__);        
                Svc_Cloud_Event_Info_Printf();
            #endif              				
            break;   
        case E_Cloud_Event_Upload:
            Svc_Cloud_Lock_Event(E_Cloud_Event_Upload); //锁定当前云事件数据上报
            Svc_Cloud_Protocol_Upload_Data();           //数据上报命令生成	
            #if LOG_FUNC_ENABLE 
                Svc_Log_Printf(LOG_INFO,"%s-> E_Cloud_Event_Upload ENTER THIS PLACE",__FUNCTION__);        
                Svc_Cloud_Event_Info_Printf();
            #endif              			
            break;   
        case E_Cloud_Event_Rsp_Info:
            Svc_Cloud_Lock_Event(E_Cloud_Event_Rsp_Info);//锁定当前云事件数据上报
            Svc_Cloud_Protocol_Reply_Requset_Info();     //返回查询参数命令生成	
            #if LOG_FUNC_ENABLE 
                Svc_Log_Printf(LOG_INFO,"%s-> E_Cloud_Event_Rsp_Info ENTER THIS PLACE",__FUNCTION__);        
                Svc_Cloud_Event_Info_Printf();
            #endif              			
            break;   
        case E_Cloud_Event_Upload_Historical:
            Svc_Cloud_Lock_Event(E_Cloud_Event_Upload_Historical);//锁定当前云事件数据上报
            Svc_Cloud_Protocol_Historical_Upload_Data();            //历史数据上报命令生成	
            #if LOG_FUNC_ENABLE 
                Svc_Log_Printf(LOG_INFO,"%s-> E_Cloud_Event_Upload_Historical ENTER THIS PLACE",__FUNCTION__);        
                Svc_Cloud_Event_Info_Printf();
            #endif              			
            break;
        case E_Cloud_Event_Rsp_Historical:
            Svc_Cloud_Lock_Event(E_Cloud_Event_Rsp_Historical);     //锁定当前云事件数据上报
            Svc_Cloud_Protocol_Reply_Requset_Historical_Data();     //返回查询历史数据命令生成
            #if LOG_FUNC_ENABLE 
                Svc_Log_Printf(LOG_INFO,"%s-> E_Cloud_Event_Rsp_Historical ENTER THIS PLACE",__FUNCTION__);        
                Svc_Cloud_Event_Info_Printf();
            #endif              
            break;
        default:
            Svc_Log_Printf(LOG_INFO,"%s->no event,enter sleep!\r\n",__FUNCTION__);
            return;
    }
    #if LOG_FUNC_ENABLE
        Svc_Log_Printf(LOG_INFO,"%s->cloud event:0x%04X\r\n",__FUNCTION__,e_event);
    #endif
}


#endif

