Esp32.Initialize.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include "CONFIG.h"
  2. #if ESP32
  3. #include "stm32f10x.h"
  4. #include <stdio.h>
  5. #include <stdarg.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include "Regist.h"
  9. #include "UDP_Client.h"
  10. #include "Initialize.h"
  11. #include "esp32.h"
  12. #include "PumpBusiness.h"
  13. #include "Log_Module.h"
  14. // 函数声明
  15. static void INITIALIZE_Process(void); // 流程
  16. static void INITIALIZE_SetStatus(enum INITIALIZE_StatusEnum status); // 设置状态
  17. static void INITIALIZE_SetResult(enum INITIALIZE_ResultEnum result); // 设置结果
  18. static void goto_start(void); // 开始
  19. static void goto_success(void); // 成功
  20. static void goto_failure(char * _info); // 失败
  21. static void goto_finish(void); // 结束
  22. // 流程
  23. enum Step{
  24. STEP_NONE, // 空闲
  25. STEP_START, // 开始
  26. STEP_READY, // 模块是否唤醒
  27. STEP_EXIT_DEEP_SLEEP, // 退出深睡眠
  28. STEP_ENTER_DEEP_SLEEP, // 进入深睡眠
  29. STEP_WAIT, // 等待
  30. STEP_CONNECT_AP, // 连接AP
  31. STEP_SUCCESS, // 成功
  32. STEP_FAILURE, // 失败
  33. STEP_FINISH, // 流程结束
  34. };
  35. // 步骤跳转时的监听
  36. static uint16_t goto_step_event(uint16_t ns)
  37. {
  38. // 重置esp32状态
  39. esp32.reset();
  40. // 流程控制
  41. uint16_t step = ns;
  42. // if(ns == STEP_SET_CFUN_1 && STEP_SET_CFUN_1_times++ >= 1)
  43. // {
  44. // goto_failure("重新联网次数过多");
  45. // step = STEP_FAILURE;
  46. // }
  47. return step;
  48. }
  49. // 流程控制
  50. static struct PCTRL_Struct pctrl = {
  51. .current_step = STEP_FINISH,
  52. .next_step = STEP_FINISH,
  53. .step_wait = STEP_WAIT,
  54. .goto_step_listener = goto_step_event,
  55. };
  56. // 备注
  57. static char info[40];
  58. // 开始
  59. static void goto_start(void)
  60. {
  61. PCTRL_GotoStep(&pctrl, STEP_START, "开始");
  62. }
  63. // 成功
  64. static void goto_success(void)
  65. {
  66. INITIALIZE_SetResult(INITIALIZE_Result_Success);
  67. PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功");
  68. }
  69. // 失败
  70. static void goto_failure(char * _info)
  71. {
  72. INITIALIZE_SetResult(INITIALIZE_Result_Failure);
  73. memset(info, 0, sizeof(info));
  74. strcpy(info, _info);
  75. PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败");
  76. Log_Printf_Debug("info:%s!\r\n", info);
  77. }
  78. // 结束
  79. static void goto_finish(void)
  80. {
  81. INITIALIZE_SetStatus(INITIALIZE_Status_Done);
  82. PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束");
  83. }
  84. // 状态
  85. static enum INITIALIZE_StatusEnum udpclient_status = INITIALIZE_Status_None;
  86. // 结果
  87. static enum INITIALIZE_ResultEnum udpclient_result = INITIALIZE_Result_None;
  88. // 设置状态
  89. static void INITIALIZE_SetStatus(enum INITIALIZE_StatusEnum status)
  90. {
  91. udpclient_status = status;
  92. }
  93. // 获取状态
  94. enum INITIALIZE_StatusEnum INITIALIZE_GetStatus(void)
  95. {
  96. return udpclient_status;
  97. }
  98. // 设置结果
  99. static void INITIALIZE_SetResult(enum INITIALIZE_ResultEnum result)
  100. {
  101. udpclient_result = result;
  102. }
  103. // 获取结果
  104. enum INITIALIZE_ResultEnum INITIALIZE_GetResult(void)
  105. {
  106. return udpclient_result;
  107. }
  108. // 重置
  109. enum EXECUTE_ResultEnum INITIALIZE_Reset(void)
  110. {
  111. if(INITIALIZE_GetStatus() == INITIALIZE_Status_Being)
  112. {
  113. Log_Printf_Debug("初始化流程重置错误!\r\n");
  114. return EXECUTE_Result_Failure;
  115. }
  116. INITIALIZE_SetStatus(INITIALIZE_Status_None);
  117. INITIALIZE_SetResult(INITIALIZE_Result_None);
  118. return EXECUTE_Result_Success;
  119. }
  120. // 开始
  121. enum EXECUTE_ResultEnum INITIALIZE_Start(void)
  122. {
  123. INITIALIZE_Reset();
  124. if(INITIALIZE_GetStatus() != INITIALIZE_Status_None)
  125. {
  126. Log_Printf_Debug("初始化流程启动错误!\r\n");
  127. return EXECUTE_Result_Failure;
  128. }
  129. goto_start();
  130. INITIALIZE_SetStatus(INITIALIZE_Status_Being);
  131. return EXECUTE_Result_Success;
  132. }
  133. // 流程处理,放到循环里
  134. void INITIALIZE_ProcessHandle(void)
  135. {
  136. if(INITIALIZE_GetStatus() == INITIALIZE_Status_Being)
  137. {
  138. INITIALIZE_Process();
  139. }
  140. }
  141. // 初始化诱因处理
  142. void INITIALIZE_TriggerHandle(void)
  143. {
  144. if((REGIST_GetStatus() != REGIST_Status_Being) && (UDPCLIENT_GetStatus() != UDPCLIENT_Status_Being))
  145. {
  146. enum Result result =esp32.ready();
  147. if(result==Result_Success)
  148. {
  149. Log_Printf_Debug("初始化诱因处理!!!\r\n");
  150. INITIALIZE_Start();
  151. }
  152. }
  153. }
  154. static enum Result result = Result_None;
  155. static void INITIALIZE_Process(void)
  156. {
  157. switch(pctrl.current_step)
  158. {
  159. case STEP_NONE: break; // 空闲
  160. case STEP_START: // 开始
  161. PCTRL_GotoStep(&pctrl, STEP_EXIT_DEEP_SLEEP, "退出深休眠");
  162. break;
  163. case STEP_EXIT_DEEP_SLEEP: // 退出深休眠
  164. esp32.exit_deepsleep();
  165. PCTRL_GotoStep(&pctrl, STEP_READY, "判断模块是否启动");
  166. break;
  167. case STEP_READY: // 判断模块是否启动
  168. result = esp32.ready();
  169. if(result == Result_Success)
  170. {
  171. PCTRL_GotoStep(&pctrl, STEP_CONNECT_AP, "连接AP");
  172. }
  173. else if(result == Result_Failed)
  174. {
  175. goto_failure("WiFi模块启动失败");
  176. }
  177. break;
  178. case STEP_CONNECT_AP: // 连接AP
  179. result = esp32.connect_ap(WIFI_ID,WIFI_PASSWORD);
  180. if(result == Result_Success)
  181. {
  182. goto_success();
  183. }
  184. else if(result == Result_Failed)
  185. {
  186. goto_failure("连接AP失败");
  187. }
  188. break;
  189. case STEP_WAIT: // 等待
  190. PCTRL_Wait(&pctrl);
  191. break;
  192. case STEP_SUCCESS: // 成功
  193. PCTRL_GotoStep(&pctrl, STEP_ENTER_DEEP_SLEEP, "泵数据发送成功,进入深休眠");
  194. break;
  195. case STEP_FAILURE: // 失败
  196. PCTRL_GotoStep(&pctrl, STEP_ENTER_DEEP_SLEEP, "泵数据发送失败,进入深休眠");
  197. break;
  198. case STEP_ENTER_DEEP_SLEEP:
  199. esp32.enter_deepsleep();
  200. Log_Printf_Debug("WiFi模块进入深休眠模式\r\n");
  201. goto_finish();
  202. break;
  203. case STEP_FINISH: // 流程结束
  204. break;
  205. default: goto_failure("步骤不存在");
  206. break;
  207. }
  208. }
  209. #endif