#include "uTask.h"
#include "includes.h"

pt_timer_t pt_timerPool;
struct pt pt_TaskFast;
struct pt pt_TaskSecond;
struct pt pt_ModemATProcess;
struct pt pt_ModemUartProcess;
struct pt pt_ModemInitProcess;
struct pt pt_LedTaskProcess;
struct pt pt_socketProcess;
struct pt pt_gpsProcess;
struct pt pt_UIProcess;
struct pt pt_UIAssistProcess;


//����ִ�еļ�����
PT_THREAD (ptFastTask(struct pt *pt)){
	
		static timer_t ptTimer;
	PT_BEGIN(pt);
		//LC_RESUME(s) switch(s) { case 0:
	while(1){
		GTMode_Detected();
		PowerOffProtetion();
		CommHandler();//������������
		KeyHandler();//��������
		ModemLedCtl();//ģ��������LED�߼���������
		MuteFlag=SetSpkLvProcess(0);
		powerSaveHandle();
		IncomingSMS();
		PTTimerStart(&pt_timerPool, &ptTimer, 1);
		//LC_SET(s) s = __LINE__; 
		//  case __LINE__:
		//		 if(!(condition)){				\  //�return;
		//      return PT_WAITING;			\
		//    }		
	  PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
	}
	PT_END(pt);
}

//1��ִ��һ�εļ�����
PT_THREAD (ptSecondTask(struct pt *pt)){
	static timer_t ptTimer;
	PT_BEGIN(pt);
			while(1){
				RTC_Update();
				BatterProcess();
				onStartCtl();
				FingerDaemonfinger();
				SMSHandle();
				PTTimerStart(&pt_timerPool, &ptTimer, 100);
				PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
			}
	PT_END(pt);
}

PT_THREAD (ptModemATProTask(struct pt *pt)){
	static timer_t ptTimer;
	PT_BEGIN(pt);
	while(1){
		ModemATProcess();
		PTTimerStart(&pt_timerPool, &ptTimer, 1);
	  PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
	}
	PT_END(pt);
}


//150msִ��һ��LED����
PT_THREAD (ptLedTask(struct pt *pt)){

	static timer_t ptTimer;
	PT_BEGIN(pt);
	while(1){
		LedProcess(0);
		PTTimerStart(&pt_timerPool, &ptTimer, 15);
	  PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
	}
	PT_END(pt);
}


void ptTimerTick(void){
	PTTimerTick(&pt_timerPool);//SYStick
}

void ptAllInit(void){
	PTTimerInitPool(&pt_timerPool);
	PT_INIT(&pt_TaskFast);
	PT_INIT(&pt_TaskSecond);
	PT_INIT(&pt_ModemATProcess);
	PT_INIT(&pt_ModemUartProcess);
	PT_INIT(&pt_ModemInitProcess);
	PT_INIT(&pt_LedTaskProcess);
	PT_INIT(&pt_socketProcess);
	PT_INIT(&pt_gpsProcess);
	PT_INIT(&pt_UIProcess);
	PT_INIT(&pt_UIAssistProcess);
}

void ptTaskRun(void){
	while(1){	
		InfoTick();
		ptFastTask(&pt_TaskFast);
		ptSecondTask(&pt_TaskSecond);
		ptModemATProTask(&pt_ModemATProcess);
		ptModemUartTask(&pt_ModemUartProcess);
		ptModemInitTask(&pt_ModemInitProcess);
		ptLedTask(&pt_LedTaskProcess);
		ptSocketTask(&pt_socketProcess);
		ptGpsTask(&pt_gpsProcess);
		ptUITask(&pt_UIProcess);
		ptUIAssist(&pt_UIAssistProcess);
	}
}

//////////////////uTimer//////////////////////
static unsigned int uSysTick=0;//��ϵͳ���Ϊ��λ
void uSysTickUpdate(void){uSysTick++;}
unsigned int uSysTickGet(void){return uSysTick;}
void uTimerStart(unsigned int *timerId, unsigned int dlyTime){
	*timerId=uSysTickGet()+dlyTime;
}

char uTimerExpired(unsigned int *timerId){
	return ((uSysTickGet()>*timerId)?1:0);
}               
/*
Ӳ��ʱ
��λ10��ms��
*/
void uTimerHardDly(short time_10ms){
	unsigned int tick;
	tick=uSysTickGet()+time_10ms;
	while(uSysTickGet()<tick) IWDG_ReloadCounter();
}

///////////////////�滻ԭRTX�е�os_tmr_call,os_tmr_create//////////////////
//���ܷ���������ɨ��,��Ϊ�ٶȲ���������������������������
//Ҫ����ϵͳ�δ���,��Ҫ��������
typedef struct{
	char status;
	unsigned short tickStart;
	unsigned short tickTarget;
}UTIMER_CALL_DEF;

UTIMER_CALL_DEF uTimerPara[UTIMER_MAX];

void uTimerCreate(unsigned char type,int timerms){
	UTIMER_CALL_DEF *uTimer;
	if(type >= UTIMER_MAX) return;
	uTimer=&uTimerPara[type];
	uTimer->tickStart=0;
	uTimer->tickTarget=timerms;
	uTimer->status=1;
}


void uTimerCall(void){
	unsigned char i;
	UTIMER_CALL_DEF *uTimer;
	for(i=0;i<UTIMER_MAX;i++){
		uTimer=&uTimerPara[i];
		if(uTimer->status != 0){
			if(++uTimer->tickStart>=uTimer->tickTarget){
				switch(i){
					case UTIMER_BEEP:
						TIM_Cmd(TIM2, DISABLE);
					if(g_ucEnterGTNow)break;
					if(sutPocStatus.Speaker==0&&sutPocStatus.TTS==0) SpeakerDisable();
					break;
					case UTIMER_MIC:MicEnable();break;
				}
				uTimer->status=0;
			}
		}
	}
}