uTask.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "uTask.h"
  2. #include "includes.h"
  3. pt_timer_t pt_timerPool;
  4. struct pt pt_TaskFast;
  5. struct pt pt_TaskSecond;
  6. struct pt pt_ModemATProcess;
  7. struct pt pt_ModemUartProcess;
  8. struct pt pt_ModemInitProcess;
  9. struct pt pt_LedTaskProcess;
  10. struct pt pt_socketProcess;
  11. struct pt pt_gpsProcess;
  12. struct pt pt_UIProcess;
  13. struct pt pt_UIAssistProcess;
  14. //快速执行的简单任务
  15. PT_THREAD (ptFastTask(struct pt *pt)){
  16. static timer_t ptTimer;
  17. PT_BEGIN(pt);
  18. //LC_RESUME(s) switch(s) { case 0:
  19. while(1){
  20. //InfoTick();
  21. GTMode_Detected();
  22. PowerOffProtetion();
  23. CommHandler();//处理串口任务
  24. KeyHandler();//按键任务
  25. ModemLedCtl();//模块启动后LED逻辑控制任务
  26. powerSaveHandle();
  27. IncomingSMS();
  28. SpkerLvlProcess(0);
  29. PTTimerStart(&pt_timerPool, &ptTimer, 1);
  30. PT_WAIT_UNTIL(pt,PTTimerIsExpired(&ptTimer));
  31. //LC_SET(s) s = __LINE__;
  32. // case __LINE__:
  33. // if(!(condition)){ \ //未到return;
  34. // return PT_WAITING; \
  35. // }
  36. }
  37. PT_END(pt);
  38. }
  39. //1秒执行一次的简单任务
  40. PT_THREAD (ptSecondTask(struct pt *pt)){
  41. static timer_t ptTimer;
  42. PT_BEGIN(pt);
  43. while(1){
  44. if(modemInitStatus==1)HeadsetProcess();
  45. RTC_Update();
  46. BatterProcess();
  47. onStartCtl();
  48. FingerDaemonfinger();
  49. //printf("VBAT2======%d\r\n",GetKey2Vbat());
  50. SMSHandle();
  51. if(m_keyreturncnt>0)m_keyreturncnt--;
  52. if(m_keyreturncnt==0&&sutUIstatus.Status!=UIS_STANDBY) UISetNextStatus(UIS_STANDBY);
  53. PTTimerStart(&pt_timerPool, &ptTimer, 100);
  54. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  55. }
  56. PT_END(pt);
  57. }
  58. PT_THREAD (ptModemATProTask(struct pt *pt)){
  59. static timer_t ptTimer;
  60. PT_BEGIN(pt);
  61. while(1){
  62. ModemATProcess();
  63. PTTimerStart(&pt_timerPool, &ptTimer, 1);
  64. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  65. }
  66. PT_END(pt);
  67. }
  68. //150ms执行一次LED任务
  69. PT_THREAD (ptLedTask(struct pt *pt)){
  70. static timer_t ptTimer;
  71. PT_BEGIN(pt);
  72. while(1){
  73. LedProcess(0);
  74. PTTimerStart(&pt_timerPool, &ptTimer, 15);
  75. PT_WAIT_UNTIL(pt, PTTimerIsExpired(&ptTimer));
  76. }
  77. PT_END(pt);
  78. }
  79. void ptTimerTick(void){
  80. PTTimerTick(&pt_timerPool);//SYStick
  81. }
  82. void ptAllInit(void){
  83. PTTimerInitPool(&pt_timerPool);
  84. PT_INIT(&pt_TaskFast);
  85. PT_INIT(&pt_TaskSecond);
  86. PT_INIT(&pt_ModemATProcess);
  87. PT_INIT(&pt_ModemUartProcess);
  88. PT_INIT(&pt_ModemInitProcess);
  89. PT_INIT(&pt_LedTaskProcess);
  90. PT_INIT(&pt_socketProcess);
  91. PT_INIT(&pt_gpsProcess);
  92. PT_INIT(&pt_UIProcess);
  93. PT_INIT(&pt_UIAssistProcess);
  94. }
  95. void ptTaskRun(void){
  96. while(1){
  97. InfoTick();
  98. ptFastTask(&pt_TaskFast);
  99. ptSecondTask(&pt_TaskSecond);
  100. ptModemATProTask(&pt_ModemATProcess);
  101. ptModemUartTask(&pt_ModemUartProcess);
  102. ptModemInitTask(&pt_ModemInitProcess);
  103. ptLedTask(&pt_LedTaskProcess);
  104. ptSocketTask(&pt_socketProcess);
  105. ptGpsTask(&pt_gpsProcess);
  106. ptUITask(&pt_UIProcess);
  107. ptUIAssist(&pt_UIAssistProcess);
  108. }
  109. }
  110. //////////////////uTimer//////////////////////
  111. static unsigned int uSysTick=0;//以系统嘀嗒为单位
  112. void uSysTickUpdate(void){uSysTick++;}
  113. unsigned int uSysTickGet(void){return uSysTick;}
  114. void uTimerStart(unsigned int *timerId, unsigned int dlyTime){
  115. *timerId=uSysTickGet()+dlyTime;
  116. }
  117. char uTimerExpired(unsigned int *timerId){
  118. return ((uSysTickGet()>*timerId)?1:0);
  119. }
  120. /*
  121. 硬延时
  122. 单位10倍ms级
  123. */
  124. void uTimerHardDly(short time_10ms){
  125. unsigned int tick;
  126. tick=uSysTickGet()+time_10ms;
  127. while(uSysTickGet()<tick) IWDG_ReloadCounter();
  128. }
  129. ///////////////////替换原RTX中的os_tmr_call,os_tmr_create//////////////////
  130. //不能放在任务中扫描,因为速度不够,否则会出现声音连续起来了
  131. //要放在系统滴答中,但要尽量简练
  132. typedef struct{
  133. char status;
  134. unsigned short tickStart;
  135. unsigned short tickTarget;
  136. }UTIMER_CALL_DEF;
  137. UTIMER_CALL_DEF uTimerPara[UTIMER_MAX];
  138. void uTimerCreate(unsigned char type,int timerms){
  139. UTIMER_CALL_DEF *uTimer;
  140. if(type >= UTIMER_MAX) return;
  141. uTimer=&uTimerPara[type];
  142. uTimer->tickStart=0;
  143. uTimer->tickTarget=timerms;
  144. uTimer->status=1;
  145. }
  146. void uTimerCall(void){
  147. unsigned char i;
  148. UTIMER_CALL_DEF *uTimer;
  149. //char buf[15];
  150. for(i=0;i<UTIMER_MAX;i++){
  151. uTimer=&uTimerPara[i];
  152. if(uTimer->status != 0){
  153. if(++uTimer->tickStart>=uTimer->tickTarget){
  154. switch(i){
  155. case UTIMER_BEEP:
  156. TIM_Cmd(TIM4, DISABLE);
  157. if(g_ucEnterGTNow)break;
  158. if(sutPocStatus.TTS==1)break;
  159. if(sutPocStatus.Speaker==0){
  160. SpeakerDisable();
  161. }
  162. break;
  163. case UTIMER_MIC:MicEnable();break;
  164. }
  165. uTimer->status=0;
  166. }
  167. }
  168. }
  169. }