cmd_response.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-03-25 19813 the first version
  9. */
  10. #define DBG_TAG "Cmd_res"
  11. #define DBG_LVL DBG_LOG
  12. #include <rtdbg.h>
  13. #include "cmd_response.h"
  14. #include "gprs.h"
  15. #include "Host.h"
  16. #include "string.h"
  17. #include "iap.h"
  18. #include "stm32g0xx_hal.h"
  19. extern uint8_t GPRSReadFlag; // 这是串口3接收中断标记位
  20. extern uint16_t GPRSReadCnt; // 串口3接收到的数据个数
  21. extern uint8_t GPRS_ReadBuff[]; // 串口3接收缓存
  22. extern uint16_t LTEReadCnt; // 串口4接收到的数据个数
  23. extern uint8_t LTEReadFlag; // 串口4接收数据完成标记位
  24. extern uint8_t LTE_ReadBuff[LTE_CMD_BUFSIZE]; // 串口4接收数据缓存
  25. //extern uint8_t Matching_running; // 标明配对模式运行中
  26. extern Loar_Device Slave_list[]; // 用于存放从机信息
  27. extern uint8_t RTC_Check; // 记录是否计划时刻唤醒 *** 关键参数 ***
  28. extern uint8_t Read_Para_ok; // 记录flash中参数是否读取完成
  29. extern void Loar_Send_CMD(uint8_t Address, uint8_t Cmd); // 用于下发对从机的命令
  30. extern uint16_t CRC16_Modbus(uint8_t *_pBuf, uint16_t _usLen); // 用于CRC计算
  31. extern uint8_t Lora_cfg_RTC; // lora配置标记位
  32. extern LOAR_Parameter loar_par; // lora 相关配置的结构体
  33. extern void CMD_Find(void); // 负责检索执行命令
  34. extern uint8_t Find_MSUB; // 写在中断中 精准检索MSUB
  35. extern uint8_t Find_CLOSED; // 写在中断中 精准检索CLOSED
  36. extern void format_uartbuf(uint8_t uart); // 用于清空串口接收缓存
  37. extern Unsend_buf wait_send[6]; // 待发送数据队列
  38. extern int inter_standby(uint16_t standbytime); // 直接休眠函数
  39. uint8_t Valve_Mode = 0; // 是否开启阀控模式
  40. uint8_t occupy_lora = Zero; // 当该标记位置1 命令解析服务独占lora
  41. uint8_t occupy_LTE = Zero; // 当该标记位置1 命令解析服务独占LTE
  42. uint8_t LTE_Ready = Zero; // 开机时按流程进行命令和链接状态的校验之后赋1 读取mqtt链接状态 4g模块返回1是(连接好)赋值为one
  43. uint8_t Active_detection = Zero; // 触发主动检测
  44. uint8_t RTC_Shotdown = Zero; // 本次立刻关机 = one ?本次立刻关机
  45. uint8_t report_finsh = Zero; // 执行主线任务时上报数据已完成
  46. // 命令解析线程 MCU不睡它不睡
  47. // 定时开机时 负责实时监听命令并响应
  48. // 被迫开机时 负责检查状态和命令并响应
  49. extern void Usart4_SendString(char *str);
  50. extern void report_update(void);
  51. // 检查链接状态
  52. //郑说新版不用
  53. uint8_t check_link(void)
  54. {
  55. // LOG_I("check_link");
  56. uint8_t result = 0;
  57. static uint8_t retry1 = 0, retry2 = 0;//发送AT指令次数 发送完等待返回次数
  58. retry1 = 0;
  59. while (occupy_LTE == One)
  60. {
  61. rt_thread_mdelay(5000);
  62. LOG_I("->LTE<-check_link");
  63. if (Find_CLOSED == 1)
  64. return 0;
  65. }
  66. format_uartbuf(4);
  67. occupy_LTE = One; // 占用LTE
  68. while (retry1 < 6)//发送AT指令次数
  69. {
  70. if ((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN") != NULL))
  71. {
  72. break;
  73. }
  74. format_uartbuf(4);
  75. Usart4_SendString("AT+IMQTTCONN\r\n");
  76. retry2 = 0;
  77. while (LTEReadFlag != 1)
  78. {
  79. rt_thread_mdelay(600);
  80. retry2++;
  81. if (retry2 > 3)
  82. break;
  83. }
  84. if ((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN") != NULL))
  85. {
  86. break;
  87. }
  88. else
  89. {
  90. rt_thread_mdelay(2000);
  91. }
  92. retry1++;
  93. // LOG_W("check_link retyr1 %d",retry1);
  94. }
  95. if ((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN:1") != NULL))//连接正常 已经登陆认证过,可以pub数据了
  96. {
  97. result = 1;
  98. LTE_Ready = One;
  99. // LOG_I("check_link try %d\n%s", retry1 + 1, LTE_ReadBuff);
  100. report_update();
  101. }
  102. else if((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN:-1") != NULL))
  103. {
  104. // LOG_W("check_link try %d\r\n%s", retry1 + 1, LTE_ReadBuff);
  105. LTE_Connect(0);
  106. Usart4_SendString("AT+IMQTTCONN\r\n");
  107. rt_thread_mdelay(300);
  108. LOG_W("AT+MQTTSTATU else\r\n%s", LTE_ReadBuff);
  109. if ((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN:0") != NULL))
  110. {
  111. result = 1;
  112. LTE_Ready = One;
  113. }
  114. }
  115. format_uartbuf(4);
  116. format_uartbuf(4);
  117. occupy_LTE = Zero; // 取消占用LTE
  118. return result;
  119. }
  120. extern Loar_Device Slave_list[];
  121. extern SYS_INFO sys_info;
  122. extern uint8_t Active_detection;
  123. extern uint8_t LTE_Cfg_Type_2_Sta;
  124. uint8_t LTE_Connect(uint8_t wait_lte)
  125. {
  126. uint8_t result = 0;
  127. if (RTC_Check == One && report_finsh == Zero)
  128. {
  129. LOG_I("LTE_Con Finsh");
  130. occupy_LTE = Zero;
  131. return 1;
  132. }
  133. if (report_finsh == One)
  134. {
  135. occupy_LTE = Zero;
  136. }
  137. if (wait_lte == 1)
  138. {
  139. while (occupy_LTE == One)
  140. {
  141. rt_thread_mdelay(3000);
  142. LOG_I("wait LTE free LTE_Con");
  143. }
  144. }
  145. occupy_LTE = One;
  146. format_uartbuf(4);
  147. Config_GPRS_State = 13;
  148. DataReturnFlage = 0;
  149. while (1)
  150. {
  151. result = LTE_config(1);
  152. rt_thread_mdelay(3);
  153. if (result == 0 || result == 1)
  154. {
  155. break;
  156. }
  157. }
  158. format_uartbuf(4);
  159. report_update();
  160. occupy_LTE = Zero;
  161. if (result == 1)
  162. LOG_I("LTE_Con succ");
  163. else
  164. LOG_I("LTE_Con fail");
  165. return result;
  166. }
  167. extern uint8_t EXTI0_1_GPIO_PIN0;
  168. extern uint8_t EXTI_Rising_Count;
  169. static void key_monitor_thread_task(void *param)
  170. {
  171. uint8_t count = 0;
  172. static uint8_t led_wait = 0;
  173. static uint8_t led_wait1 = 0;
  174. static int _KYE_PB5 = 0;
  175. while (1)
  176. {
  177. if(HAL_GPIO_ReadPin(EXT_KEY_GPIO_Port, EXT_KEY_Pin) == GPIO_PIN_SET)
  178. {
  179. rt_thread_mdelay(150);
  180. EXTI_Rising_Count++;
  181. EXTI0_1_GPIO_PIN0 = 0;
  182. // _KYE_PB5++;
  183. // if(_KYE_PB5 >= 3) //计数
  184. // {
  185. // LED_buling(200, 2);
  186. // Trigger_report(2);
  187. // break;
  188. // }
  189. }
  190. if (EXTI_Rising_Count >= 2 && EXTI_Rising_Count <= 10)
  191. {
  192. if (HAL_GPIO_ReadPin(EXT_KEY_GPIO_Port, EXT_KEY_Pin) == GPIO_PIN_SET)
  193. {
  194. count++;
  195. }
  196. else
  197. {
  198. count = 0;
  199. }
  200. }
  201. if (count >= 5)
  202. {
  203. LED_buling(200, 2);
  204. if (RTC_Check == One)
  205. {
  206. break;
  207. }
  208. else
  209. {
  210. Trigger_report(2);
  211. }
  212. }
  213. rt_thread_mdelay(30); // 线程延时
  214. led_wait++;
  215. led_wait1++;
  216. if(led_wait1 > 900)// 大概9s以上
  217. {
  218. break;
  219. }
  220. if ((led_wait % 33 == 0 /*&& (Node_Type == LTE) */&& led_wait != 0))//led刷新
  221. {
  222. HAL_GPIO_TogglePin(RUN_STATUS_GPIO_Port, RUN_STATUS_Pin);
  223. led_wait = 0;
  224. }
  225. }
  226. }
  227. // 仅作为监听是否有数据下发及响应
  228. int key_monitor_thread(void)
  229. {
  230. rt_thread_t tid1 = RT_NULL;
  231. tid1 = rt_thread_create("key_monitor_thread",
  232. key_monitor_thread_task, RT_NULL,
  233. 1024,
  234. 9, 5);
  235. /* 如果获得线程控制块,启动这个线程 */
  236. if (tid1 != RT_NULL)
  237. {
  238. rt_thread_startup(tid1);
  239. }
  240. else
  241. LOG_E("MSUB failed");
  242. return 0;
  243. }
  244. //INIT_APP_EXPORT(cmd_response_thread); // 校验连接状态
  245. //INIT_APP_EXPORT(monitor_MSUB_thread); // 监听命令及响应
  246. INIT_APP_EXPORT(key_monitor_thread); // 监听命令及响应