#include "sr_log.h"
#include "sr_shell.h"
#include "sr_gpio.h"
#include "sr_osal.h"

#include "sr_sunrise.h"


//修改引脚编号
#ifdef TEST_GPIO_SET_PIN
#define  GPIO_ID1  TEST_GPIO_1
#define  GPIO_ID2  TEST_GPIO_2
#define  GPIO_ID3  TEST_GPIO_3
#define  GPIO_ID4  TEST_GPIO_4
#else
#define  GPIO_ID1  SR_GPIO19
#define  GPIO_ID2  SR_GPIO20
#define  GPIO_ID3  SR_WAKE_PWRKEY
#define  GPIO_ID4  SR_GPIO16
#endif

static int GpioOutPutExmp(int argc, char *argv[])
{
	int ret = -1, count = 0;
	uint32_t level1 = 0;
	SR_GPIO_CFG_T config = {0};
	gShellThreadRun =1;

	config.gpioMode = SR_GPIO_OUTPUT;		  // 输出
	config.pull = SR_GPIO_NP;				  // 无上下拉
	config.initLvl = SR_GPIO_LOW;			  // 初始低电平
	ret = SR_HalGpioInit(GPIO_ID1, &config);  // 初始化
	SR_LOG(INFO, "1: gpio_id1 output init, ret=%d\r\n", ret);
    
	while (gShellThreadRun)
	{
		/***间隔1s读写电平*****/
		if (count == 100)
		{
			// 设置电平
			SR_HalGpioWrite(GPIO_ID1, SR_GPIO_HIGH);
			// 读取电平
			level1 = SR_HalGpioRead(GPIO_ID1);
			SR_LOG(INFO, "level1=%d  \r\n", level1);
		}
		else if (count == 200)
		{
			count = 0;
			// 设置电平:翻转
			SR_HalGpioWrite(GPIO_ID1, SR_GPIO_TOGGLE);
			// 读取电平
			level1 = SR_HalGpioRead(GPIO_ID1);
			SR_LOG(INFO, "level1=%d  \r\n", level1);
		}

		count++;
		SR_OsDelay(10);
	}
	
	return 0;

}
//将函数GpioOutPutExm映射为命令gpioOutPutExmp
SR_SHELL_CMD_EXPORT(gpioOutPutExmp, GpioOutPutExmp);

static int GpioInPutExmp(int argc, char *argv[])
{
	int ret = -1, count = 0;
	uint32_t level2 = 0;
	SR_GPIO_CFG_T config = {0};
	gShellThreadRun =1;

    config.gpioMode = SR_GPIO_INPUT;		  // 输入
	config.pull = SR_GPIO_PU;				  // 上拉
	ret = SR_HalGpioInit(GPIO_ID2, &config);  // 初始化
	SR_LOG(INFO, "2: gpio_id2 pull up input init, ret=%d\r\n", ret);
    
	while (gShellThreadRun)
	{
		/***间隔1s读写电平*****/
		if (count == 100)
		{
			// 读取电平
			level2 = SR_HalGpioRead(GPIO_ID2);
			SR_LOG(INFO, "level2=%d  \r\n", level2);
		}
		else if (count == 200)
		{
			count = 0;
			// 读取电平
			level2 = SR_HalGpioRead(GPIO_ID2);
			SR_LOG(INFO, "level2=%d  \r\n", level2);
		}
		count++;
		SR_OsDelay(10);
	}
	
	return 0;

}
//将函数GpioInPutExmp映射为命令gpioInPutExmp
SR_SHELL_CMD_EXPORT(gpioInPutExmp, GpioInPutExmp);

static uint8_t gpioFlag3 = 0, gpioArg3 = 0;
static uint8_t gpioFlag4 = 0, gpioArg4 = 0;

// 中断回调
static void UserGpioCbFun3(void *args)
{
	// 中断里不要调用打印函数SR_LOG
	
	gpioFlag3 = 1;
	gpioArg3 = *((uint8_t *)args);
}
static SR_GPIO_IRQ_CB_T gpioCb_3;

static void UserGpioCbFun4(void *args)
{
	// 中断里不要调用打印函数SR_LOG

	gpioFlag4 = 1;
	gpioArg4 = *((uint8_t *)args);
}
static SR_GPIO_IRQ_CB_T gpioCb_4;

static int GpioIrqExmp(int argc, char *argv[])
{
	int ret = -1, count = 0;
	uint32_t level3 = 0, level4 = 0;
	SR_GPIO_CFG_T config = {0};
    uint8_t intArg = 100;
	char charArg = 'A';
    
	gShellThreadRun =1;

    config.pull = SR_GPIO_PU;			       // 上拉
	config.gpioMode = SR_GPIO_IRQ;		       // 中断模式
	config.irqMode = SR_GPIO_IRQ_FALLING;      // 下降沿触发
	gpioCb_3.func = UserGpioCbFun3;	           // 中断回调
	gpioCb_3.args = &intArg;			       // 中断回调参数
	config.irqCb = &gpioCb_3;
	ret = SR_HalGpioInit(GPIO_ID3, &config); // 初始化
	SR_LOG(INFO, "3:gpio_id3 irq_falling exit init, ret=%d\r\n", ret);

	config.pull = SR_GPIO_PD;			       // 下拉
	config.gpioMode = SR_GPIO_IRQ;		       // 中断模式
	config.irqMode = SR_GPIO_IRQ_RISING;      // 上升沿触发
	gpioCb_4.func = UserGpioCbFun4;	           // 中断回调
	gpioCb_4.args = &charArg;			       // 中断回调参数
	config.irqCb = &gpioCb_4;
	ret = SR_HalGpioInit(GPIO_ID4, &config);   // 初始化
	SR_LOG(INFO, "4:gpio_id4 irq_rising exit init, ret=%d\r\n", ret);
    
	while (gShellThreadRun)
	{
		if (gpioFlag3) // 中断，打印提示
		{
			gpioFlag3 = 0;
			SR_LOG(INFO, "[GPIO] gpio_cb3 enter:gpio_id3 falling!,args=%d", gpioArg3);
		}

		if (gpioFlag4) // 中断，打印提示
		{
			gpioFlag4 = 0;
			SR_LOG(INFO, "[GPIO] gpio_cb4 enter:gpio_id4 rising!,args=%c", gpioArg4);
		}
       /***间隔1s读写电平*****/
		if (count == 100)
		{
			// 读取电平
			level3 = SR_HalGpioRead(GPIO_ID3);
			SR_LOG(INFO, "level3=%d  \r\n", level3);
		}
		else if (count == 200)
		{
			count = 0;
			// 读取电平
			level4 = SR_HalGpioRead(GPIO_ID4);
			SR_LOG(INFO, "level4=%d  \r\n", level4);
		}
		count++;
		SR_OsDelay(10); 
	}
	
	return 0;

}
//将函数GpioIrqExmp映射为命令gpioIrqExmp
SR_SHELL_CMD_EXPORT(gpioIrqExmp, GpioIrqExmp);