#include "pt.h"

int len = 1;
char usr_input1[27] = 'a';
char usr_input2[27] = 'A';

// 任务1: 第一行文字快闪->慢闪->循环
void task1()
{
	PT_INIT() // 任务初始化, 之后可以跟一些每次都需要执行的代码
	static int n;
	static int rec_len;
	if (rec_len != len)
	{
		rec_len = len;
		PT_RESET(); // 有文字变化时重置任务
	}
	PT_BEGIN() // 任务开始
	Box(0, 0, 159, 13, 1, 0);
	for (;;)
	{
		for (n = 1; n < 10; n++)
		{
			TextOut(0, 0, usr_input1, 0x41);
			delay(n * 50); // 实际是#define的PT_DELAY_MS, 会主动在延时没到退出任务, 时间到了再继续
			Box(0, 0, len * 6, 13, 1, 0);
			delay(n * 50);
		}
		for (n = 10; n > 0; n--)
		{
			TextOut(0, 0, usr_input1, 0x41);
			delay(n * 50);
			Box(0, 0, len * 6, 13, 1, 0);
			delay(n * 50);
		}
	}
	PT_END() // 任务结束, 会自动从头开始
}

// 任务2: 第2行文字均匀闪烁
void task2()
{
	PT_INIT()
	static int rec_len;
	if (rec_len != len)
	{
		rec_len = len;
		PT_RESET(); // 有文字变化时重置任务
	}
	PT_BEGIN()
	Box(0, 16, 159, 29, 1, 0);
	for (;;)
	{
		TextOut(0, 16, usr_input2, 0x41);
		delay(500);
		Box(0, 16, len * 6, 29, 1, 0);
		delay(500);
	}
	PT_END()
}

// 任务3: 检测按键,更新第一行文字为小写, 第二行文字为大写, F2和左删除, ESC结束软件
void task3()
{
	char ch;
	PT_INIT()
	PT_BEGIN()
	for (;;)
	{
		PT_WAIT_UNTIL(ch = CheckKey(128)); // 等待按键按下, 替代getchar
		if (isgraph(ch) && len < sizeof(usr_input1) - 1)
		{
			usr_input1[len] = tolower(ch);
			usr_input2[len] = toupper(ch);
			len++;
			usr_input1[len] = 0;
			usr_input2[len] = 0;
		}
		else if (ch == 29 || ch == 23)
		{
			if (len > 0)
			{
				len--;
				usr_input1[len] = 0;
				usr_input2[len] = 0;
			}
		}
		else if (ch == 27)
		{
			exit(0);
		}
		PT_WAIT_WHILE(CheckKey(128)); // 等待按键抬起
	}
	PT_END()
}

void main()
{
	long tick;
	for (;;)
	{
		tick = GetTickCount();
		task1();
		task2();
		task3();
		if (tick == GetTickCount())
		{
			Delay(4);
		}
	}
}
