Bc260y_Initialize.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. #include "CONFIG.h"
  2. #if BC260Y
  3. #include "stm32f10x.h"
  4. #include <stdio.h>
  5. #include <stdarg.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include "PumpBusiness.h"
  9. #include "Log_Module.h"
  10. #include "Initialize.h"
  11. #include "bc260y.h"
  12. // 函数声明
  13. static void INITIALIZE_Process(void); // 流程
  14. static void INITIALIZE_SetStatus(enum INITIALIZE_StatusEnum status); // 设置状态
  15. static void INITIALIZE_SetResult(enum INITIALIZE_ResultEnum result); // 设置结果
  16. static void goto_start(void); // 开始
  17. static void goto_success(void); // 成功
  18. static void goto_failure(char * _info); // 失败
  19. static void goto_finish(void); // 结束
  20. // 流程
  21. enum Step{
  22. STEP_START, // 开始
  23. STEP_EXIT_SLEEP, // 退出睡眠
  24. STEP_ENTER_SLEEP, // 进入睡眠
  25. STEP_SET_SLEEP ,// 设置休眠模式
  26. STEP_QUERY_CFUN,
  27. STEP_SET_CFUN_0,
  28. STEP_SET_CFUN_1, // 设置全功能模式
  29. STEP_WAIT_SET_CFUN_1, // 等待设置全功能模式结果
  30. STEP_WAIT, // 等待
  31. STEP_SET_QISDE_0,
  32. STEP_SET_QISDE_1,
  33. STEP_SET_CEREG_2, // 设置ps域允许上报网络注册和位置信息
  34. STEP_QUERY_CEREG, // 查询网络注册状态
  35. STEP_SUCCESS, // 成功
  36. STEP_FAILURE, // 失败
  37. STEP_FINISH,
  38. };
  39. // 步骤跳转时的监听
  40. static uint8_t STEP_SET_CFUN_1_times = 0; // 全功能模式的次数
  41. static uint16_t goto_step_event(uint16_t ns)
  42. {
  43. // 重置bc260y状态
  44. bc260y.reset();
  45. // 流程控制
  46. uint16_t step = ns;
  47. if(ns == STEP_SET_CFUN_1 && STEP_SET_CFUN_1_times++ >= 1)
  48. {
  49. goto_failure("重新联网次数过多");
  50. step = STEP_FAILURE;
  51. }
  52. return step;
  53. }
  54. // 流程控制
  55. static struct PCTRL_Struct pctrl = {
  56. .current_step = STEP_FINISH,
  57. .next_step = STEP_FINISH,
  58. .step_wait = STEP_WAIT,
  59. .goto_step_listener = goto_step_event,
  60. };
  61. // 备注
  62. static char info[40];
  63. // 开始
  64. static void goto_start(void)
  65. {
  66. PCTRL_GotoStep(&pctrl, STEP_START, "开始");
  67. }
  68. // 成功
  69. static void goto_success(void)
  70. {
  71. INITIALIZE_SetResult(INITIALIZE_Result_Success);
  72. PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功");
  73. }
  74. // 失败
  75. static void goto_failure(char * _info)
  76. {
  77. INITIALIZE_SetResult(INITIALIZE_Result_Failure);
  78. memset(info, 0, sizeof(info));
  79. strcpy(info, _info);
  80. PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败");
  81. Log_Printf_Debug("info:%s!\r\n", info);
  82. }
  83. // 结束
  84. static void goto_finish(void)
  85. {
  86. INITIALIZE_SetStatus(INITIALIZE_Status_Done);
  87. PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束");
  88. }
  89. // 状态
  90. static enum INITIALIZE_StatusEnum udpclient_status = INITIALIZE_Status_None;
  91. // 结果
  92. static enum INITIALIZE_ResultEnum udpclient_result = INITIALIZE_Result_None;
  93. // 设置状态
  94. static void INITIALIZE_SetStatus(enum INITIALIZE_StatusEnum status)
  95. {
  96. udpclient_status = status;
  97. }
  98. // 获取状态
  99. enum INITIALIZE_StatusEnum INITIALIZE_GetStatus(void)
  100. {
  101. return udpclient_status;
  102. }
  103. // 设置结果
  104. static void INITIALIZE_SetResult(enum INITIALIZE_ResultEnum result)
  105. {
  106. udpclient_result = result;
  107. }
  108. // 获取结果
  109. enum INITIALIZE_ResultEnum INITIALIZE_GetResult(void)
  110. {
  111. return udpclient_result;
  112. }
  113. // 重置
  114. enum EXECUTE_ResultEnum INITIALIZE_Reset(void)
  115. {
  116. if(INITIALIZE_GetStatus() == INITIALIZE_Status_Being)
  117. {
  118. Log_Printf_Debug("初始化流程重置错误!\r\n");
  119. return EXECUTE_Result_Failure;
  120. }
  121. INITIALIZE_SetStatus(INITIALIZE_Status_None);
  122. INITIALIZE_SetResult(INITIALIZE_Result_None);
  123. return EXECUTE_Result_Success;
  124. }
  125. // 开始
  126. enum EXECUTE_ResultEnum INITIALIZE_Start(void)
  127. {
  128. INITIALIZE_Reset();
  129. if(INITIALIZE_GetStatus() != INITIALIZE_Status_None)
  130. {
  131. Log_Printf_Debug("初始化流程启动错误!\r\n");
  132. return EXECUTE_Result_Failure;
  133. }
  134. goto_start();
  135. INITIALIZE_SetStatus(INITIALIZE_Status_Being);
  136. return EXECUTE_Result_Success;
  137. }
  138. // 流程处理,放到循环里
  139. void INITIALIZE_ProcessHandle(void)
  140. {
  141. if(INITIALIZE_GetStatus() == INITIALIZE_Status_Being)
  142. {
  143. INITIALIZE_Process();
  144. }
  145. }
  146. // 初始化诱因处理
  147. void INITIALIZE_TriggerHandle(void)
  148. {
  149. enum Result result =bc260y.ready();
  150. if(result==Result_Success)
  151. {
  152. INITIALIZE_Start();
  153. }
  154. }
  155. static enum Result result = Result_None;
  156. static uint8_t cgreg_n;
  157. static uint8_t cgreg_stat;
  158. static uint16_t cgreg_lac;
  159. static uint32_t cgreg_ci;
  160. static void INITIALIZE_Process(void)
  161. {
  162. switch(pctrl.current_step)
  163. {
  164. case STEP_START: // 开始
  165. PCTRL_GotoStep(&pctrl, STEP_EXIT_SLEEP, "退出休眠");
  166. break;
  167. case STEP_EXIT_SLEEP: // 退出休眠
  168. result = bc260y.exit_sleep_2();
  169. if(result == Result_Success)
  170. {
  171. PCTRL_GotoStep(&pctrl, STEP_SET_QISDE_1, "开启回显");
  172. }
  173. else if(result == Result_Failed)
  174. {
  175. goto_failure("退出休眠失败");
  176. }
  177. break;
  178. case STEP_SET_QISDE_1: // 开启回显
  179. result = bc260y.set_qisde(1);
  180. if(result == Result_Success)
  181. {
  182. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
  183. }
  184. else if(result == Result_Failed)
  185. {
  186. goto_failure("开启回显失败");
  187. }
  188. break;
  189. case STEP_SET_CFUN_0:
  190. result=bc260y.set_cfun(0);//设置最小功能模式
  191. if(result == Result_Success)
  192. {
  193. if(INITIALIZE_GetResult() != INITIALIZE_Result_None)
  194. {
  195. goto_finish();
  196. }
  197. else
  198. {
  199. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_1, "设置全功能模式");
  200. }
  201. }
  202. else if(result == Result_Failed)
  203. {
  204. goto_failure("设置最小功能模式失败");
  205. goto_finish();
  206. }
  207. break;
  208. case STEP_SET_CFUN_1:
  209. result = bc260y.set_cfun(1);
  210. if(result == Result_Success)
  211. {
  212. PCTRL_GotoStep(&pctrl, STEP_SET_CEREG_2, "设置网络状态");
  213. }
  214. else if(result == Result_Failed)
  215. {
  216. goto_failure("设置全功能模式失败");
  217. }
  218. break;
  219. case STEP_SET_CEREG_2: // 设置ps域
  220. result = bc260y.set_cereg(2);
  221. if(result == Result_Success)
  222. {
  223. PCTRL_GotoStep(&pctrl, STEP_QUERY_CEREG, "查询网络状态");
  224. }
  225. else if(result == Result_Failed)
  226. {
  227. goto_failure("设置ps域失败");
  228. }
  229. break;
  230. case STEP_QUERY_CEREG: // 查询ps域
  231. result = bc260y.query_cereg(&cgreg_n, &cgreg_stat, &cgreg_lac, &cgreg_ci);
  232. if(result == Result_Success)
  233. {
  234. if(cgreg_stat == 1)
  235. {
  236. goto_success();
  237. }
  238. else
  239. {
  240. goto_failure("网络注册失败");
  241. }
  242. }
  243. else if(result == Result_Failed)
  244. {
  245. goto_failure("网络注册失败");
  246. }
  247. break;
  248. case STEP_WAIT: // 等待
  249. PCTRL_Wait(&pctrl);
  250. break;
  251. case STEP_SUCCESS: // 成功
  252. goto_finish();
  253. break;
  254. case STEP_FAILURE: // 失败
  255. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "初始化失败,设置最小功能模式");
  256. break;
  257. case STEP_FINISH: // 结束流程
  258. break;
  259. default:
  260. goto_failure("步骤不存在");
  261. break;
  262. }
  263. }
  264. #endif