#include "sr_log.h"
#include "sr_shell.h"
#include "at.h"
#include <string.h>

#include "app_main.h"

#define NB_UART_ID SR_UART2

static struct at_client nbClient;
void nb_client_init(void)
{
	// GPIO初始化
	Bsp_Nb_Init();
	// 硬件复位
	Svc_Nb_Core_Reset();

	// AT Client初始化
	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 = 720;
	at_client_init(&nbClient, NB_UART_ID, &config, 720);
}

void nb_power_reset(void)
{
	// GPIO初始化
	Bsp_Nb_Init();
	// 硬件复位
	Svc_Nb_Core_Reset();
}

/***************网卡相关测试**********************************/

#include "sr_osal.h"
#include "sr_netdev.h"
#include "sr_ctwing.h"


#define CTW_SERVER_IP "2000000126.nb.ctwing.cn"
#define CTW_SERVER_PORT 5683

#define CTW_TEST_DATA "313233343536"


static SR_NETDEV_T *atNetdev = SR_NULL;

static void UserNetdevEvtCb(void *args, SR_NET_EVENT_E event, uint8_t index, uint8_t status)
{
	switch (event)
	{
	case SR_NET_EVT_CFUN:
		// SR_LOG(INFO,"[EVT]EVENT_CFUN: index=%d status=%d", index,status);
		if (status == SR_CFUN_MODE_FLY)
			SR_LOG(INFO, "Enter fly mode!");
		else if (status == SR_CFUN_MODE_FULL)
			SR_LOG(INFO, "Exit fly mode!");
		break;

	case SR_NET_EVT_REGSTA:
		SR_LOG(INFO, "[EVT]EVENT_REGISTER:网络注册状态变更，status=%d", status);

		if (SR_NET_REG_REGISTERED == status)
			SR_LOG(INFO, "网络已注册");

		break;

	case SR_NET_EVT_LINK:
		SR_LOG(INFO, "[EVT]EVENT_NETIF: 网络连接状态变更 status=%d", status);

		if (status == SR_NET_LINK_ON)
			SR_LOG(INFO, "LINK ON!");
		else if (status == SR_NET_LINK_OFF)
			SR_LOG(INFO, "LINK OFF!");
		break;
	}
}


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;
	}

}


static SR_THD_RET AtNetdevThd(void *args)
{
	SR_GET_CT(); // 获取当前上下文
	int ret;
	AT_DEVICE_T *atDev = atNetdev->atDev;
	static uint8_t cnt = 0;

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

	// 网卡UART连接测试
	cnt = 4;
	while (cnt--)
	{
		ret = SR_AtClientWaitConnect(&atDev->atClient, 3000);
		if (ret != SR_OK)
		{
			SR_LOG(INFO, "wait AT timeout,ret(%d)", ret);
		}
		else
		{
			SR_LOG(INFO, "AT conn OK", ret);
		}

		osDelay(3000);
	}

	// 网络使能
	ret = SR_HalNetSwitch(atNetdev, 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);
	}

#if  0
	// CTWING连接
	ret = SR_HalNetCtwConnect(atNetdev, &param);
	if (ret != SR_OK)
	{
		SR_LOG(INFO, "ctwing conn fail,ret(%d)", ret);
		goto _END;
	}
	SR_LOG(INFO, "ctwing conn OK", ret);

	// CTWING数据收发
	while (gShellThreadRun)
	{
		SR_LOG(WARN, "\r\nctwing start send...", ret);
		ret = SR_HalNetCtwSend(atNetdev, CTW_TEST_DATA, 12);

		SR_LOG(INFO, "ctwing send,ret(%d)", ret);

		osDelay(10000);
	}

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

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

	// CTWING连接
	ret = SR_CtwAtConnect();
	if (ret != SR_OK)
	{
		SR_LOG(INFO, "ctwing conn fail,ret(%d)", ret);
		goto _END;
	}
	SR_LOG(INFO, "ctwing conn OK", ret);

	// CTWING数据收发
	while (gShellThreadRun)
	{
		SR_LOG(WARN, "\r\nctwing start send...", ret);
		ret = SR_CtwAtSend(CTW_TEST_DATA,12);

		SR_LOG(INFO, "ctwing send,ret(%d)", ret);

		osDelay(10000);
	}


#endif
_END:

	SR_LOG(INFO, "thd exit!", ret);
	osThreadExit(); // 退出线程

	SR_CT_END(); // 上下文环境结束
}
int AtNetdevTest(int argc, char **argv)
{
	// osThreadId_t thd;
	// 网卡硬件初始化
	nb_power_reset();

	// 查找网卡
	atNetdev = SR_NetdevFind("lmb26");
	if (atNetdev == SR_NULL)
	{
		SR_LOG(INFO, "netdev not found");
		return -1;
	}
	SR_LOG(INFO, "find netdev: lmb26");

	// 注册网络事件
	SR_HalNetSetEvtCb(atNetdev, UserNetdevEvtCb, SR_NULL);

	gShellThreadRun = 1;
	// 创建线程3，动态方式，全部使用默认参数
	osThreadNew(AtNetdevThd, SR_NULL, SR_NULL);

	return 0;
}
SR_SHELL_CMD_EXPORT(lmb26Test, AtNetdevTest);

/*********AT 命令调试模式**************/
SR_DEVICE_T *atUartDev = SR_NULL;
struct ct_sem atUartSem;
uint8_t recvBuf[128];
uint8_t sendBuf[64];
uint16_t recvLen = 0;

// 串口事件回调
static void UserUartCb(SR_DEVICE_T *dev, SR_UART_EVENT_E event, uint32_t size, void *args)
{
	switch (event)
	{
	case SR_UART_EVT_RXNE:

		// 发送信号量
		recvLen = size;
		SR_CT_SEM_RELEASE(&atUartSem);
		break;
	}
}

int AtModeThd(void *args)
{
	SR_GET_CT();
	int ret;
	SR_UART_CFG_T config = SR_UART_CFG_DEFAULT; // 初始默认配置

	SR_CT_BEGIN();

	Bsp_Nb_Init(); // GPIO初始化
	// 复位低 ，电源高
	Svc_Nb_Core_Reset();

	// 获取设备句柄
	atUartDev = SR_HalUartOpen(NB_UART_ID);

	// 参数配置
	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 = 512;
	SR_HalUartConfig(atUartDev, &config);

	// 注册回调
	SR_HalUartSetCb(atUartDev, UserUartCb, 0);

	// 初始化信号量
	SR_CT_SEM_INIT(&atUartSem, 1);

	while (gShellThreadRun)
	{
		SR_CT_SEM_TAKE(ct, &atUartSem, OS_WAIT_FOREVER);

		// 转发至LOG串口
		ret = SR_HalUartRead(atUartDev, recvBuf, recvLen);
		if (ret > 0)
		{
			recvBuf[ret] = 0;
			SR_Printf("%*s", ret, recvBuf);
		}
	}

	SR_CT_END();
}

int AtModeEnter(int argc, char **argv)
{
	gShellThreadRun = 1;
	// 创建协程
	SR_OsThreadCreate("atMode", AtModeThd, SR_NULL, 48, 1);

	return 0;
}
SR_SHELL_CMD_EXPORT(atMode, AtModeEnter);

int AtUartSend(int argc, char **argv)
{
	if (argc < 2)
		return -1;

	sprintf((char *)sendBuf, "%s\r\n", argv[1]);
	SR_HalUartWrite(atUartDev, sendBuf, strlen((char *)sendBuf));

	return 0;
}
SR_SHELL_CMD_EXPORT(atu_send, AtUartSend);

/*
atu_send ATE0


*/

// uart接收数据，空间不够
