app_1_1.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. /****************************************************************************
  2. *
  3. * Copy right: 2020-, Copyrigths of QIXIANG TECH Ltd.
  4. * File name: app.c 睡眠测试
  5. * Description: QX app source file
  6. * History: Rev1.0 2020-10-16
  7. * Athuor: chenjie
  8. *
  9. ****************************************************************************/
  10. //include
  11. #include "bsp.h"
  12. #include "bsp_custom.h"
  13. #include "osasys.h"
  14. #include "ostask.h"
  15. #include "queue.h"
  16. #include "ps_event_callback.h"
  17. #include "app.h"
  18. #include "cmisim.h"
  19. #include "cmimm.h"
  20. #include "cmips.h"
  21. #include "sockets.h"
  22. #include "psifevent.h"
  23. #include "ps_lib_api.h"
  24. #include "lwip/netdb.h"
  25. #include <cis_def.h>
  26. #include "debug_log.h"
  27. #include "slpman_ec616.h"
  28. #include "plat_config.h"
  29. //define
  30. // app task static stack and control block
  31. #define PROC_TASK_STACK_SIZE (1024)
  32. uint8_t process0SlpHandler = 0xff;
  33. uint8_t process1SlpHandler = 0xfe;
  34. uint8_t process2SlpHandler = 0xfd;
  35. uint8_t deepslpTimerID = 0;
  36. typedef enum
  37. {
  38. PROCESS0_STATE_IDLE = 0,
  39. PROCESS0_STATE_WORK,
  40. PROCESS0_STATE_SLEEP
  41. }process0SM;
  42. typedef enum
  43. {
  44. PROCESS1_STATE_IDLE = 0,
  45. PROCESS1_STATE_WORK,
  46. PROCESS1_STATE_SLEEP
  47. }process1SM;
  48. typedef enum
  49. {
  50. PROCESS2_STATE_IDLE = 0,
  51. PROCESS2_STATE_WORK,
  52. PROCESS2_STATE_SLEEP
  53. }process2SM;
  54. static StaticTask_t gProcessTask0;
  55. static UINT8 gProcessTaskStack0[PROC_TASK_STACK_SIZE];
  56. static StaticTask_t gProcessTask1;
  57. static UINT8 gProcessTaskStack1[PROC_TASK_STACK_SIZE];
  58. static StaticTask_t gProcessTask2;
  59. static UINT8 gProcessTaskStack2[PROC_TASK_STACK_SIZE];
  60. process0SM gProc0State = PROCESS0_STATE_IDLE;
  61. process1SM gProc1State = PROCESS1_STATE_IDLE;
  62. process2SM gProc2State = PROCESS2_STATE_IDLE;
  63. #define PROC0_STATE_SWITCH(a) (gProc0State = a)
  64. #define PROC1_STATE_SWITCH(a) (gProc1State = a)
  65. #define PROC2_STATE_SWITCH(a) (gProc2State = a)
  66. static void appBeforeHib(void *pdata, slpManLpState state)
  67. {
  68. uint32_t *p_param = (uint32_t *)pdata;
  69. ECOMM_TRACE(UNILOG_PLA_APP, appBeforeHib_1, P_SIG, 1, "Before Hibernate = %x",*p_param);
  70. }
  71. static void appAfterHib(void *pdata, slpManLpState state)
  72. {
  73. ECOMM_TRACE(UNILOG_PLA_APP, appAfterHib_1, P_SIG, 0, "Try Hibernate Failed, Interrupt Pending. Only sleep failed this function will excute");
  74. }
  75. static void appBeforeSlp1(void *pdata, slpManLpState state)
  76. {
  77. ECOMM_TRACE(UNILOG_PLA_APP, appBeforeSlp1_1, P_SIG, 0, "Before Sleep1");
  78. }
  79. static void appAfterSlp1(void *pdata, slpManLpState state)
  80. {
  81. ECOMM_TRACE(UNILOG_PLA_APP, appAfterSlp1_1, P_SIG, 0, "After Sleep1, no matter sleep success or not this function will excute");
  82. }
  83. static void appBeforeSlp2(void *pdata, slpManLpState state)
  84. {
  85. ECOMM_TRACE(UNILOG_PLA_APP, appBeforeSlp2_1, P_SIG, 0, "Before Sleep2");
  86. }
  87. static void appAfterSlp2(void *pdata, slpManLpState state)
  88. {
  89. ECOMM_TRACE(UNILOG_PLA_APP, appAfterSlp2_1, P_SIG, 0, "Sleep2 Failed, Interrupt Pending. Only sleep failed this function will excute");
  90. }
  91. static void process0AppTask(void* arg)
  92. {
  93. NetSocDisplay(0,LED_TURN_OFF);
  94. NetSocDisplay(1,LED_TURN_OFF);
  95. NetSocDisplay(2,LED_TURN_OFF);
  96. NetSocDisplay(3,LED_TURN_OFF);
  97. NetSocDisplay(4,LED_TURN_OFF);
  98. uint32_t inParam = 0xAABBCCDD;
  99. uint32_t cnt;
  100. slpManSetPmuSleepMode(true,SLP_HIB_STATE,false);
  101. //slpManApplyPlatVoteHandle("process0slp",&process0SlpHandler);
  102. slpManRegisterUsrdefinedBackupCb(appBeforeHib,&inParam,SLPMAN_HIBERNATE_STATE);
  103. slpManRegisterUsrdefinedRestoreCb(appAfterHib,NULL,SLPMAN_HIBERNATE_STATE);
  104. slpManRegisterUsrdefinedBackupCb(appBeforeSlp1,NULL,SLPMAN_SLEEP1_STATE);
  105. slpManRegisterUsrdefinedRestoreCb(appAfterSlp1,NULL,SLPMAN_SLEEP1_STATE);
  106. slpManRegisterUsrdefinedBackupCb(appBeforeSlp2,NULL,SLPMAN_SLEEP2_STATE);
  107. slpManRegisterUsrdefinedRestoreCb(appAfterSlp2,NULL,SLPMAN_SLEEP2_STATE);
  108. slpManSlpState_t slpstate = slpManGetLastSlpState();
  109. UINT8 Can_index = 0;
  110. UINT8 Uart_index = 0;
  111. uint8_t sleep_index = 0;
  112. PROC0_STATE_SWITCH(PROCESS0_STATE_IDLE);
  113. while(1)
  114. {
  115. switch(gProc0State)
  116. {
  117. case PROCESS0_STATE_IDLE:
  118. {
  119. PROC0_STATE_SWITCH(PROCESS0_STATE_WORK);
  120. break;
  121. }
  122. case PROCESS0_STATE_WORK:
  123. {
  124. NetSocDisplay(0,LED_TURN_ON);
  125. osDelay(10);//10ms
  126. Can_index++;
  127. Uart_index++;
  128. if (Uart_index >10)//Uart 100ms 调用一次
  129. {
  130. PROC2_STATE_SWITCH(PROCESS2_STATE_WORK);
  131. Uart_index = 0;
  132. }
  133. if (Can_index >=100)//Can 1000ms 调用一次
  134. {
  135. PROC1_STATE_SWITCH(PROCESS1_STATE_WORK);
  136. Can_index = 0;
  137. }
  138. if (sleep_index>5000)
  139. {
  140. sleep_index =0;
  141. PROC0_STATE_SWITCH(PROCESS0_STATE_SLEEP);
  142. }
  143. break;
  144. }
  145. case PROCESS0_STATE_SLEEP:
  146. {
  147. slpManSlpState_t State;
  148. uint8_t cnt;
  149. //slpManPlatVoteEnableSleep(process0SlpHandler, SLP_HIB_STATE); // cancel the prohibition of sleep2
  150. //slpManDeepSlpTimerStart(deepslpTimerID, 60000); // create a 30s timer, DeepSleep Timer is always oneshoot
  151. while(1) // now app can enter hib, but ps and phy maybe not, so wait here
  152. {
  153. osDelay(3000);
  154. }
  155. }
  156. }
  157. }
  158. }
  159. static void process1AppTask(void* arg)
  160. {
  161. PROC1_STATE_SWITCH(PROCESS1_STATE_IDLE);
  162. //slpManApplyPlatVoteHandle("process1slp",&process1SlpHandler);
  163. NVIC_EnableIRQ(PadWakeup0_IRQn);
  164. while(1)
  165. {
  166. switch(gProc1State)
  167. {
  168. case PROCESS1_STATE_IDLE:
  169. {
  170. break;
  171. }
  172. case PROCESS1_STATE_WORK:
  173. {
  174. NetSocDisplay(1,LED_TURN_ON);
  175. osDelay(10000);
  176. PROC1_STATE_SWITCH(PROCESS1_STATE_SLEEP);
  177. break;
  178. }
  179. case PROCESS1_STATE_SLEEP:
  180. {
  181. //slpManPlatVoteDisableSleep(process1SlpHandler, SLP_SLP2_STATE);
  182. break;
  183. }
  184. }
  185. }
  186. }
  187. static void process2AppTask(void* arg)
  188. {
  189. PROC2_STATE_SWITCH(PROCESS2_STATE_IDLE);
  190. //slpManApplyPlatVoteHandle("process2slp",&process2SlpHandler);
  191. NVIC_EnableIRQ(PadWakeup0_IRQn);
  192. while(1)
  193. {
  194. switch(gProc2State)
  195. {
  196. case PROCESS2_STATE_IDLE:
  197. {
  198. break;
  199. }
  200. case PROCESS2_STATE_WORK:
  201. {
  202. NetSocDisplay(2,LED_TURN_ON);
  203. osDelay(20000);
  204. PROC2_STATE_SWITCH(PROCESS2_STATE_SLEEP);
  205. break;
  206. }
  207. case PROCESS2_STATE_SLEEP:
  208. {
  209. //slpManPlatVoteDisableSleep(process2SlpHandler, SLP_SLP2_STATE);
  210. break;
  211. }
  212. }
  213. }
  214. }
  215. /**
  216. \fn process0Init(void)
  217. \brief process0Init function.
  218. \return
  219. */
  220. void process0Init(void)
  221. {
  222. osThreadAttr_t task_attr;
  223. #ifndef USING_PRINTF
  224. if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
  225. {
  226. HAL_UART_RecvFlowControl(false);
  227. }
  228. #endif
  229. memset(&task_attr,0,sizeof(task_attr));
  230. memset(gProcessTaskStack0, 0xA5,PROC_TASK_STACK_SIZE);
  231. task_attr.name = "Process0AppTask";
  232. task_attr.stack_mem = gProcessTaskStack0;
  233. task_attr.stack_size = PROC_TASK_STACK_SIZE;
  234. task_attr.priority = osPriorityNormal;//osPriorityBelowNormal;
  235. task_attr.cb_mem = &gProcessTask0;//task control block
  236. task_attr.cb_size = sizeof(StaticTask_t);//size of task control block
  237. osThreadNew(process0AppTask, NULL, &task_attr);
  238. }
  239. /**
  240. \fn process1Init(void)
  241. \brief process1Init function.
  242. \return
  243. */
  244. void process1Init(void)
  245. {
  246. osThreadAttr_t task_attr;
  247. #ifndef USING_PRINTF
  248. if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
  249. {
  250. HAL_UART_RecvFlowControl(false);
  251. }
  252. #endif
  253. memset(&task_attr,0,sizeof(task_attr));
  254. memset(gProcessTaskStack1, 0xA5,PROC_TASK_STACK_SIZE);
  255. task_attr.name = "Process1AppTask";
  256. task_attr.stack_mem = gProcessTaskStack1;
  257. task_attr.stack_size = PROC_TASK_STACK_SIZE;
  258. task_attr.priority = osPriorityNormal;//osPriorityBelowNormal;
  259. task_attr.cb_mem = &gProcessTask1;//task control block
  260. task_attr.cb_size = sizeof(StaticTask_t);//size of task control block
  261. osThreadNew(process1AppTask, NULL, &task_attr);
  262. }
  263. /**
  264. \fn process2Init(void)
  265. \brief process2Init function.
  266. \return
  267. */
  268. void process2Init(void)
  269. {
  270. osThreadAttr_t task_attr;
  271. memset(&task_attr,0,sizeof(task_attr));
  272. memset(gProcessTaskStack2, 0xA5,PROC_TASK_STACK_SIZE);
  273. task_attr.name = "Process2AppTask";
  274. task_attr.stack_mem = gProcessTaskStack2;
  275. task_attr.stack_size = PROC_TASK_STACK_SIZE;
  276. task_attr.priority = osPriorityNormal;//osPriorityBelowNormal;
  277. task_attr.cb_mem = &gProcessTask2;//task control block
  278. task_attr.cb_size = sizeof(StaticTask_t);//size of task control block
  279. osThreadNew(process2AppTask, NULL, &task_attr);
  280. }
  281. /**
  282. \fn appInit(void)
  283. \brief appInit function.
  284. \return
  285. */
  286. void appInit(void *arg)
  287. {
  288. process0Init();
  289. process1Init();
  290. process2Init();
  291. }
  292. /**
  293. \fn int main_entry(void)
  294. \brief main entry function.
  295. \return
  296. */
  297. void main_entry(void) {
  298. BSP_CommonInit();
  299. osKernelInitialize();
  300. registerAppEntry(appInit, NULL);
  301. if (osKernelGetState() == osKernelReady)
  302. {
  303. osKernelStart();
  304. }
  305. while(1);
  306. }