/* * 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 #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); // 监听命令及响应