#include "sr_config.h"
#include "sr_shell.h"


#ifdef SR_USE_OS
#include "cmsis_os2.h"

#ifdef BSP_PLAT_HEZHOU
#include "luat_rtos.h"

#endif

#endif


uint8_t gShellThreadRun = 0;

void shell_thread_stop(void)
{
	gShellThreadRun = 0;
}


#ifdef SR_USE_OS

void _ShellThread(void *args)
{
	char c = 0;

	while(1)
	{
		if (Read_RingBuff((uint8_t *)&c))
		{
			// BSP_DEBUG_PRINTF("[shell] recv: %c\n",c);
			if (ansi_get_char(c, &nr_ansi) == NR_SHELL_END_CHAR)
			{
				shell_parser(&nr_shell, nr_ansi.current_line);
				ansi_clear_current_line(&nr_ansi);
			}
		}

		osDelay(10);
	}
}
	

#else

void SR_ShellTask(void)
{
	char c = 0;
	if (Read_RingBuff((uint8_t *)&c))
	{

		//SR_PRINTF("[shell] recv: %c\n",c);
		if (ansi_get_char(c, &nr_ansi) == NR_SHELL_END_CHAR)
		{
			shell_parser(&nr_shell, nr_ansi.current_line);
			ansi_clear_current_line(&nr_ansi);
		}
	}
}
//SR_POLL_TASK_EXPORT(SR_ShellTask, 1, SR_PRIORITY_0);
#endif

int SR_ShellInit(void)
{
	RingBuff_Init();
	ansi_init(&nr_ansi);
	_shell_init(&nr_shell);

#ifdef SR_USE_OS

#ifdef BSP_PLAT_HEZHOU
	//暂时用合宙原厂线程API，合宙SDK中cmsis 线程内打印浮点有问题
	luat_rtos_task_handle shellThd;
    luat_rtos_task_create(&shellThd, 6144, 50, "shell", _ShellThread, SR_NULL, 0);

#else
	//创建单独的shell线程
	osThreadId_t  shellThd=SR_NULL;
	
	const osThreadAttr_t threadAttr = 
	{
	  .stack_size = 6144,	//6K
	  .priority =osPriorityNormal,
	};
	
	shellThd = osThreadNew(_ShellThread, SR_NULL, &threadAttr);

	return (shellThd==SR_NULL)? SR_EKERNEL:SR_OK;
#endif

#endif
    return SR_OK;
}
SR_INIT_COMPONENT_EXPORT(SR_ShellInit, SR_PRIORITY_0);
