#include "sr_shell.h"
#include "sr_log.h"

#include "sr_osal.h"


typedef struct stackTest
{
  int i;
  int j;
}STACK_TEST_T;

static int ctNest1();

SR_CT_T ct1,ct2;  //根节点协程句柄


static int ctThd1(void *args)
{
	int ret;
	SR_GET_CT();
	
	SR_CT_BEGIN();
	

	while(gShellThreadRun) 
	{
		SR_LOG(INFO,"thd1: loop!");

		ret = SR_CT_CHILD(ctNest1());
 
		SR_LOG(INFO,"thd1: delay!,ret = %d",ret);
		SR_CT_DELAY_MS( 1000);
		  
	} 

	return 0;

	SR_CT_END();
}


static int ctThd2(void *args)
{
	int ret;
	SR_GET_CT();
	//SR_SET_STACK_SIZE(ct,sizeof(SR_CT_T));
	
	SR_CT_BEGIN();

	while(gShellThreadRun) 
	{
		ret = SR_CT_CHILD(ctNest1());
		SR_LOG(INFO,"thd2: loop!  ,ret = %d",ret);
	} 

	SR_CT_END();
}


static int ctNest2(void)
{
	SR_GET_CT();
	
	SR_CT_BEGIN();
	
	SR_LOG(ERR,"ctNest2 loop.....");
	SR_CT_DELAY_MS( 3000);

	return -2;
	
	SR_CT_END();
}

static int ctNest1(void)
{
	int ret;
	SR_GET_CT();
	STACK_TEST_T *stack= (STACK_TEST_T *)SR_ALLOC_STACK(ct,sizeof(STACK_TEST_T));

	SR_CT_BEGIN();


	for(stack->i =0;stack->i<6;stack->i++)
	{
		SR_LOG(INFO,"nest1: ctAddr(0x%X),i(%d),j(%d),delay 2s!",ct,stack->i,stack->j);
		SR_CT_DELAY_MS(2000);
		ret = SR_CT_CHILD(ctNest2());
		SR_LOG(INFO,"nest1: ret(%d)",ret);

		stack->j+=2;
	}

	return -1;

	SR_CT_END();
}


static int CtExample(int argc, char *argv[])
{
	gShellThreadRun =1;

	osThreadAttr_t th2Attr = {0};
	th2Attr.name = "ctThd1";				  // 线程名称
	th2Attr.stack_size = 128,			  // 线程栈大小
	th2Attr.priority = osPriorityNormal1, // 线程优先级

	osThreadNew(ctThd1, SR_NULL, SR_NULL);

	th2Attr.name = "ctThd2";
	osThreadNew(ctThd2, SR_NULL, SR_NULL);



	return 0;
}
SR_SHELL_CMD_EXPORT(ctExmp, CtExample);




struct ct semThd;
struct ct_sem mySem;

int _semThdTest(struct ct *ct,void *args)
{

	
	SR_CT_BEGIN();
	SR_CT_SEM_INIT(&mySem, 0);  //信号量清0
	
	while(1)
	{
		SR_CT_SEM_TAKE(ct,&mySem,500);	
	
		if(SR_CT_IS_TIMEOUT()==SR_TRUE)
		{
			SR_LOG(INFO,"sem timeout");
		}

		SR_CT_DELAY_MS(2000);
	}
	
	SR_CT_END();
}

int semThdTest(void)
{

	 _semThdTest(&semThd,SR_NULL);
	
	return 0;
}

