#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_GPIO15         // PA15 RED_LED
#define  GPIO_ID2  SR_GPIO23         // PB3 GREEN_LED
#define  GPIO_ID3  SR_GPIO11         // PB13 KEY
#define  GPIO_ID4  SR_GPIO33         // PA11 PULSE

#endif
/*本代码在运行测试时，受限于测试硬件接口限制，重复使用SR_GPIO33为按键输入引脚，需多次修改GPIO_ID2\3\4为SR_GPIO33多次测试*/

/*********************************************************************************************************
			gpio输出使用示例
*********************************************************************************************************/
static SR_THD_RET _GpioOutputThdExmp(void *arg)
{
	int ret = -1;
	uint32_t level1 = 0;
	SR_GPIO_CFG_T config = {0};

	SR_GET_CT(); 				// 获取当前上下文
	SR_CT_BEGIN();			   // 上下文环境起始

	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读写电平*****/
		SR_HalGpioWrite(GPIO_ID1, SR_GPIO_HIGH);
		level1 = SR_HalGpioRead(GPIO_ID1);
		SR_LOG(INFO, "level1=%d  \r\n", level1);
		osDelay(1000);
		
		// 设置电平:翻转
		SR_HalGpioWrite(GPIO_ID1, SR_GPIO_TOGGLE);
		// 读取电平
		level1 = SR_HalGpioRead(GPIO_ID1);
		SR_LOG(INFO, "level1=%d  \r\n", level1);
		osDelay(1000);
	}
        
    osThreadExit();  //退出线程
        
	SR_CT_END(); 			// 上下文环境结束
	
}
static int GpioOutputExmp(int argc, char *argv[])
{
    osThreadId_t gpioOutputThread = SR_NULL;

    gShellThreadRun = 1;

    gpioOutputThread = osThreadNew(_GpioOutputThdExmp, SR_NULL, SR_NULL);

    return 0;
}

//将函数GpioOutputExm映射为命令gpioOutputExmp
SR_SHELL_CMD_EXPORT(gpioOutputExmp, GpioOutputExmp);

/*********************************************************************************************************
			gpio输出使用示例-裸机纯延时
*********************************************************************************************************/
#if 0
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读写电平*****/
		SR_HalGpioWrite(GPIO_ID1, SR_GPIO_HIGH);
		level1 = SR_HalGpioRead(GPIO_ID1);
		SR_LOG(INFO, "level1=%d  \r\n", level1);
		SR_Delay(1000);
		
		// 设置电平:翻转
		SR_HalGpioWrite(GPIO_ID1, SR_GPIO_TOGGLE);
		// 读取电平
		level1 = SR_HalGpioRead(GPIO_ID1);
		SR_LOG(INFO, "level1=%d  \r\n", level1);
		SR_Delay(1000);
    }

    return 0;

}
//将函数GpioOutputExm映射为命令gpioOutputExmp
SR_SHELL_CMD_EXPORT(gpioOutputExmp, GpioOutputExmp);


#endif

/*********************************************************************************************************
			gpio输入使用示例
*********************************************************************************************************/
static SR_THD_RET GpioInputThdExmp(void *arg)
{
	int ret = -1;
	uint32_t level2 = 0;
	SR_GPIO_CFG_T config = {0};

	SR_GET_CT(); 				// 获取当前上下文
	SR_CT_BEGIN();			   // 上下文环境起始
	
    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读写电平*****/

		level2 = SR_HalGpioRead(GPIO_ID2);
		SR_LOG(INFO, "level2=%d  \r\n", level2);
		osDelay(1000);

		level2 = SR_HalGpioRead(GPIO_ID2);
		SR_LOG(INFO, "level2=%d  \r\n", level2);
		osDelay(1000);
	}
	
	osThreadExit();  //退出线程
        
	SR_CT_END(); 			// 上下文环境结束

}

static int GpioInputExmp(int argc, char *argv[])
{
    osThreadId_t gpioInputThread = SR_NULL;

    gShellThreadRun = 1;

    gpioInputThread = osThreadNew(GpioInputThdExmp, SR_NULL, SR_NULL);

    return 0;
}

//将函数GpioInputExmp映射为命令gpioInputExmp
SR_SHELL_CMD_EXPORT(gpioInputExmp, GpioInputExmp);

/*********************************************************************************************************
			gpio中断使用示例
*********************************************************************************************************/
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 SR_THD_RET GpioIrqThdExmp(void *arg)
{
	int ret = -1, count = 0;
	uint32_t level3 = 0, level4 = 0;
	SR_GPIO_CFG_T config = {0};
    uint8_t intArg = 100;
	char charArg = 'A';
    
	SR_GET_CT(); 				// 获取当前上下文
	SR_CT_BEGIN();			   // 上下文环境起始

    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++;
		osDelay(10); 
	}
	
	osThreadExit();  //退出线程  
	SR_CT_END(); 			// 上下文环境结束

}

static int GpioIrqExmp(int argc, char *argv[])
{
    osThreadId_t gpioIrqThread = SR_NULL;

    gShellThreadRun = 1;

    gpioIrqThread = osThreadNew(GpioIrqThdExmp, SR_NULL, SR_NULL);

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