Bc260y_Initialize.c 6.3 KB

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