| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- /*
- * Copyright (c) 2006-2021, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2022-03-25 19813 the first version
- */
- #define DBG_TAG "Cmd_res"
- #define DBG_LVL DBG_LOG
- #include <rtdbg.h>
- #include "cmd_response.h"
- #include "gprs.h"
- #include "Host.h"
- #include "string.h"
- #include "iap.h"
- #include "stm32g0xx_hal.h"
- extern uint8_t GPRSReadFlag; // 这是串口3接收中断标记位
- extern uint16_t GPRSReadCnt; // 串口3接收到的数据个数
- extern uint8_t GPRS_ReadBuff[]; // 串口3接收缓存
- extern uint16_t LTEReadCnt; // 串口4接收到的数据个数
- extern uint8_t LTEReadFlag; // 串口4接收数据完成标记位
- extern uint8_t LTE_ReadBuff[LTE_CMD_BUFSIZE]; // 串口4接收数据缓存
- //extern uint8_t Matching_running; // 标明配对模式运行中
- extern Loar_Device Slave_list[]; // 用于存放从机信息
- extern uint8_t RTC_Check; // 记录是否计划时刻唤醒 *** 关键参数 ***
- extern uint8_t Read_Para_ok; // 记录flash中参数是否读取完成
- extern void Loar_Send_CMD(uint8_t Address, uint8_t Cmd); // 用于下发对从机的命令
- extern uint16_t CRC16_Modbus(uint8_t *_pBuf, uint16_t _usLen); // 用于CRC计算
- extern uint8_t Lora_cfg_RTC; // lora配置标记位
- extern LOAR_Parameter loar_par; // lora 相关配置的结构体
- extern void CMD_Find(void); // 负责检索执行命令
- extern uint8_t Find_MSUB; // 写在中断中 精准检索MSUB
- extern uint8_t Find_CLOSED; // 写在中断中 精准检索CLOSED
- extern void format_uartbuf(uint8_t uart); // 用于清空串口接收缓存
- extern Unsend_buf wait_send[6]; // 待发送数据队列
- extern int inter_standby(uint16_t standbytime); // 直接休眠函数
- uint8_t Valve_Mode = 0; // 是否开启阀控模式
- uint8_t occupy_lora = Zero; // 当该标记位置1 命令解析服务独占lora
- uint8_t occupy_LTE = Zero; // 当该标记位置1 命令解析服务独占LTE
- uint8_t LTE_Ready = Zero; // 开机时按流程进行命令和链接状态的校验之后赋1 读取mqtt链接状态 4g模块返回1是(连接好)赋值为one
- uint8_t Active_detection = Zero; // 触发主动检测
- uint8_t RTC_Shotdown = Zero; // 本次立刻关机 = one ?本次立刻关机
- uint8_t report_finsh = Zero; // 执行主线任务时上报数据已完成
- // 命令解析线程 MCU不睡它不睡
- // 定时开机时 负责实时监听命令并响应
- // 被迫开机时 负责检查状态和命令并响应
- extern void Usart4_SendString(char *str);
- extern void report_update(void);
- // 检查链接状态
- //郑说新版不用
- uint8_t check_link(void)
- {
- // LOG_I("check_link");
- uint8_t result = 0;
- static uint8_t retry1 = 0, retry2 = 0;//发送AT指令次数 发送完等待返回次数
- retry1 = 0;
- while (occupy_LTE == One)
- {
- rt_thread_mdelay(5000);
- LOG_I("->LTE<-check_link");
- if (Find_CLOSED == 1)
- return 0;
- }
- format_uartbuf(4);
- occupy_LTE = One; // 占用LTE
- while (retry1 < 6)//发送AT指令次数
- {
- if ((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN") != NULL))
- {
- break;
- }
- format_uartbuf(4);
- Usart4_SendString("AT+IMQTTCONN\r\n");
- retry2 = 0;
- while (LTEReadFlag != 1)
- {
- rt_thread_mdelay(600);
- retry2++;
- if (retry2 > 3)
- break;
- }
- if ((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN") != NULL))
- {
- break;
- }
- else
- {
- rt_thread_mdelay(2000);
- }
- retry1++;
- // LOG_W("check_link retyr1 %d",retry1);
- }
- if ((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN:1") != NULL))//连接正常 已经登陆认证过,可以pub数据了
- {
- result = 1;
- LTE_Ready = One;
- // LOG_I("check_link try %d\n%s", retry1 + 1, LTE_ReadBuff);
- report_update();
- }
- else if((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN:-1") != NULL))
- {
- // LOG_W("check_link try %d\r\n%s", retry1 + 1, LTE_ReadBuff);
- LTE_Connect(0);
- Usart4_SendString("AT+IMQTTCONN\r\n");
- rt_thread_mdelay(300);
- LOG_W("AT+MQTTSTATU else\r\n%s", LTE_ReadBuff);
- if ((strstr((const char *)LTE_ReadBuff, "+IMQTTCONN:0") != NULL))
- {
- result = 1;
- LTE_Ready = One;
- }
- }
- format_uartbuf(4);
- format_uartbuf(4);
- occupy_LTE = Zero; // 取消占用LTE
- return result;
- }
- extern Loar_Device Slave_list[];
- extern SYS_INFO sys_info;
- extern uint8_t Active_detection;
- extern uint8_t LTE_Cfg_Type_2_Sta;
- uint8_t LTE_Connect(uint8_t wait_lte)
- {
- uint8_t result = 0;
- if (RTC_Check == One && report_finsh == Zero)
- {
- LOG_I("LTE_Con Finsh");
- occupy_LTE = Zero;
- return 1;
- }
- if (report_finsh == One)
- {
- occupy_LTE = Zero;
- }
- if (wait_lte == 1)
- {
- while (occupy_LTE == One)
- {
- rt_thread_mdelay(3000);
- LOG_I("wait LTE free LTE_Con");
- }
- }
- occupy_LTE = One;
- format_uartbuf(4);
- Config_GPRS_State = 13;
- DataReturnFlage = 0;
- while (1)
- {
- result = LTE_config(1);
- rt_thread_mdelay(3);
- if (result == 0 || result == 1)
- {
- break;
- }
- }
- format_uartbuf(4);
- report_update();
- occupy_LTE = Zero;
- if (result == 1)
- LOG_I("LTE_Con succ");
- else
- LOG_I("LTE_Con fail");
- return result;
- }
- extern uint8_t EXTI0_1_GPIO_PIN0;
- extern uint8_t EXTI_Rising_Count;
- static void key_monitor_thread_task(void *param)
- {
- uint8_t count = 0;
- static uint8_t led_wait = 0;
- static uint8_t led_wait1 = 0;
- static int _KYE_PB5 = 0;
- while (1)
- {
- if(HAL_GPIO_ReadPin(EXT_KEY_GPIO_Port, EXT_KEY_Pin) == GPIO_PIN_SET)
- {
- rt_thread_mdelay(150);
- EXTI_Rising_Count++;
- EXTI0_1_GPIO_PIN0 = 0;
- // _KYE_PB5++;
- // if(_KYE_PB5 >= 3) //计数
- // {
- // LED_buling(200, 2);
- // Trigger_report(2);
- // break;
- // }
- }
- if (EXTI_Rising_Count >= 2 && EXTI_Rising_Count <= 10)
- {
- if (HAL_GPIO_ReadPin(EXT_KEY_GPIO_Port, EXT_KEY_Pin) == GPIO_PIN_SET)
- {
- count++;
- }
- else
- {
- count = 0;
- }
- }
- if (count >= 5)
- {
- LED_buling(200, 2);
- if (RTC_Check == One)
- {
- break;
- }
- else
- {
- Trigger_report(2);
- }
- }
- rt_thread_mdelay(30); // 线程延时
- led_wait++;
- led_wait1++;
- if(led_wait1 > 900)// 大概9s以上
- {
- break;
- }
- if ((led_wait % 33 == 0 /*&& (Node_Type == LTE) */&& led_wait != 0))//led刷新
- {
- HAL_GPIO_TogglePin(RUN_STATUS_GPIO_Port, RUN_STATUS_Pin);
- led_wait = 0;
- }
- }
- }
- // 仅作为监听是否有数据下发及响应
- int key_monitor_thread(void)
- {
- rt_thread_t tid1 = RT_NULL;
- tid1 = rt_thread_create("key_monitor_thread",
- key_monitor_thread_task, RT_NULL,
- 1024,
- 9, 5);
- /* 如果获得线程控制块,启动这个线程 */
- if (tid1 != RT_NULL)
- {
- rt_thread_startup(tid1);
- }
- else
- LOG_E("MSUB failed");
- return 0;
- }
- //INIT_APP_EXPORT(cmd_response_thread); // 校验连接状态
- //INIT_APP_EXPORT(monitor_MSUB_thread); // 监听命令及响应
- INIT_APP_EXPORT(key_monitor_thread); // 监听命令及响应
|