From 7d7f2f1dab2e30b153f36de247db8f93b41020c7 Mon Sep 17 00:00:00 2001 From: czq <860517298@qq.com> Date: Fri, 6 Jun 2025 09:16:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8Lwrb=E5=BA=93=E4=BC=98=E5=8C=964G=E4=B8=8A?= =?UTF-8?q?=E6=8A=A5=E5=A4=9A=E6=9D=A1=E6=95=B0=E6=8D=AE=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E5=86=B2=E7=AA=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/inc/bsp_ml307r.h | 14 ++++- bsp/src/bsp_adc.c | 51 ------------------ bsp/src/bsp_bmp390.c | 2 - bsp/src/bsp_ml307r.c | 121 +++++++++++++++++++++++++------------------ bsp/src/bsp_valve.c | 18 ++++--- 5 files changed, 95 insertions(+), 111 deletions(-) diff --git a/bsp/inc/bsp_ml307r.h b/bsp/inc/bsp_ml307r.h index b718938..d4a8cf6 100644 --- a/bsp/inc/bsp_ml307r.h +++ b/bsp/inc/bsp_ml307r.h @@ -3,7 +3,8 @@ #include "CH58x_common.h" - +#include "lwrb.h" +#include "bsp_valve.h" /*4G 模块控制引脚*/ #define ENABLE_3_8_V GPIO_Pin_3 //PB3 @@ -110,7 +111,7 @@ static void BSP_Ml307_Power_Off(void); void BSP_Ml307r_Init(void); -void Iot_Send_Data(void); +void Iot_Send_Data(TeFrameCmd cmd); void Ml307r_Loop(void); void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len); void BSP_ML307_StartTimeoutTimer(void); @@ -120,6 +121,15 @@ static void BSP_Read_Module(void); static void BSP_simcom_init(void); static void BSP_Get_Module_Info(void); static void BSP_Module_Connect_CtWing(void); + +// 状态上报请求结构体 +typedef struct { + TeFrameCmd cmd; // 命令类型 +} TsIotSendRequest; + +// 声明状态上报队列 +extern lwrb_t iot_send_queue; +extern uint8_t iot_send_queue_buffer[sizeof(TsIotSendRequest) * 5]; // 可以存储5个请求 #endif //!@__BSP_ML307R_H__ diff --git a/bsp/src/bsp_adc.c b/bsp/src/bsp_adc.c index ddd5650..8b853ce 100644 --- a/bsp/src/bsp_adc.c +++ b/bsp/src/bsp_adc.c @@ -42,57 +42,6 @@ void ADC_GPIO_Init(void) R8_ADC_CFG |= RB_ADC_POWER_ON; } - -// void Send_Low_Battery_Message(float vbat) -// { -// char json_buffer[300]; -// char time_str[20] = {0}; -// snprintf(json_buffer, sizeof(json_buffer), -// "{" -// "\"device\":{" -// "\"id\":\"SCV001\"," -// "\"type\":\"SelfClosingValve\"," -// "\"time\":\"%s\"" -// "}," -// "\"status\":\"closed\"," -// "\"fault\":{" -// "\"lowBattery\":true," -// "\"commError\":false," -// "\"code\":1001" -// "}," -// "\"monitor\":{" -// "\"pressure\":0.8," -// "\"voltage\":%.2f," -// "\"lowVoltage\":true" -// "}," -// "\"network\":{" -// "\"sinr\":15.2," -// "\"rsrp\":-95.5," -// "\"signal\":4" -// "}," -// "\"standards\":{" -// "\"iotId\":\"IoT-SCV-12345\"" -// "}" -// "}", -// time_str, vbat); -// BSP_Module_Emergency_Send((uint8_t*)json_buffer, strlen(json_buffer)); -// logDebug("Send low battery message: %s\n", json_buffer); -// } - -// // 处理电池电压低事件 -// void Handle_Low_Battery(float vbat) -// { -// if (!vbat_low_flag) { -// VALVE_CLOSE(); -// LED_VALVE_CLOSE; -// Send_Low_Battery_Message(vbat); -// vbat_low_flag = 1; -// logDebug("Voltage is too low (%.2fV),Close valve\n", vbat); -// } -// LED_VBAT_OPEN; -// DelayMs(100); -// } - uint16_t VBAT_ProcessEvent(uint8_t task_id, uint16_t events) { if (events & VBAT_EVT_START) diff --git a/bsp/src/bsp_bmp390.c b/bsp/src/bsp_bmp390.c index 71ef750..8ad71f7 100644 --- a/bsp/src/bsp_bmp390.c +++ b/bsp/src/bsp_bmp390.c @@ -1051,7 +1051,6 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) if (motor_flag == 1) { motor_flag = 0; - LED_VALVE_OPEN; BSP_VALVE_Open(kValveCmdManualOpen); // 浣跨敤鏅氬紑闃鍛戒护 keydown_flag = 1; IotFlag_t.Valve_Open_flag = 1; @@ -1061,7 +1060,6 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) else if (motor_flag == 2) { motor_flag = 0; - LED_VALVE_CLOSE; // 鐩存帴浣跨敤鏅氬叧闃鍛戒护 BSP_VALVE_Close(kValveCmdManualClose); diff --git a/bsp/src/bsp_ml307r.c b/bsp/src/bsp_ml307r.c index 06e6c0c..ddd4595 100644 --- a/bsp/src/bsp_ml307r.c +++ b/bsp/src/bsp_ml307r.c @@ -12,13 +12,17 @@ #include "time.h" #include #include "cJSON.h" -#include "bsp_valve.h" #include "bsp_adc.h" + #undef LOG_ENABLE #define LOG_ENABLE 1 IotFlagStruct IotFlag_t; +// 创建环形缓冲区用于存储IoT发送请求 +lwrb_t iot_send_queue; +uint8_t iot_send_queue_buffer[sizeof(TsIotSendRequest) * 5] = {0}; + #define ML307_PERIODIC_EVT (0x0001 << 0) @@ -722,15 +726,24 @@ static void BSP_SendMessage(void) void BSP_ML307_SendMessage(void) { - // 根据系统状态确定命令类型 - TeFrameCmd cmd = kCmdData; // 默认为数据命令 - - if (gValveData.switch_status == kClosed) - { - cmd = gValveCloseReason; - }else - { - cmd = gValveOpenReason; + // 默认命令类型 + TeFrameCmd cmd = kCmdData; + + // 从队列中读取一个请求 + TsIotSendRequest request; + if (lwrb_get_full(&iot_send_queue) >= sizeof(request)) { + lwrb_read(&iot_send_queue, &request, sizeof(request)); + cmd = request.cmd; + logDebug("Get command type: %d\r\n", cmd); + } else { + // 如果队列为空,则使用默认逻辑 + if (gValveData.switch_status == kClosed) + { + cmd = gValveCloseReason; + }else + { + cmd = gValveOpenReason; + } } // 生成JSON数据 @@ -744,7 +757,7 @@ void BSP_ML307_SendMessage(void) logDebug("json_data len %d\r\n", strlen(json_data)); BSP_SendMessage(); } else { - logDebug("JSON数据内存分配失败!\n"); + logDebug("JSON Memory failure!\n"); IotFlag_t.send_error_flag = 1; } } @@ -1051,33 +1064,31 @@ static void BSP_Iot_Loop(void) { logDebug("send_complete_into_stop\r\n"); IotFlag_t.send_complete_flag = 0; - state = 0; + // 检查指针是否为NULL后再释放,避免重复释放 if(json_data != NULL) { tmos_msg_deallocate((uint8_t *)json_data); json_data = NULL; } - MultiTimerStart(&Multi_StopTask_t, STOP_TASK_INTERVAL_TIME, StopTask_CallBack, NULL); //关闭 + + // 检查队列中是否还有待发送的请求 + if (lwrb_get_full(&iot_send_queue) >= sizeof(TsIotSendRequest)) { + logDebug("The queue has data to be sent, continue\r\n"); + IotFlag_t.ModInfo_success_flag = 1; + state = 5; // 直接跳转到发送状态 + } else { + logDebug("send finish\r\n"); + state = 0; + MultiTimerStart(&Multi_StopTask_t, STOP_TASK_INTERVAL_TIME, StopTask_CallBack, NULL); //关闭 + } }else { - // if (IotFlag_t.Loop_count_flag > 2) - // { - // logDebug("Loop_count_flag_end %d\r\n",IotFlag_t.Loop_count_flag); - state = 0; - IotFlag_t.Iot_Retry_flag = 0; - IotFlag_t.module_init_flag = 0; - MultiTimerStart(&Multi_StopTask_t, STOP_TASK_INTERVAL_TIME, StopTask_CallBack, NULL); - // } - // if((IotFlag_t.Iot_Retry_flag == 0)&&(IotFlag_t.Loop_count_flag < 3)) - // { - // logDebug("error_into_loop\r\n"); - // logDebug("Loop_count_flag %d\r\n",IotFlag_t.Loop_count_flag); - // BSP_Ml307_Power_Off(); //关机 - // MultiTimerStart(&Multi_Loop_t, LOOP_INTERVAL_TIME, Loop_CallBack, NULL); - // IotFlag_t.Iot_Retry_flag = 1; - // } + state = 0; + IotFlag_t.Iot_Retry_flag = 0; + IotFlag_t.module_init_flag = 0; + MultiTimerStart(&Multi_StopTask_t, STOP_TASK_INTERVAL_TIME, StopTask_CallBack, NULL); } - break; + break; } } @@ -1105,6 +1116,8 @@ void BSP_Ml307r_Init(void) { if(IotFlag_t.Date_Sending_flag == 0) { + // 初始化状态上报队列 + lwrb_init(&iot_send_queue, iot_send_queue_buffer, sizeof(iot_send_queue_buffer)); BSP_UART1_Init(); Ml307r_Gpio_Init(); ml307r_obj = at_obj_create(&at_adapter);//Create AT communication object @@ -1125,28 +1138,36 @@ void BSP_Ml307r_Init(void) } } -void Iot_Send_Data(void) +void Iot_Send_Data(TeFrameCmd cmd) { - if(IotFlag_t.Date_Sending_flag == 0) - { - logDebug("Iot_Send_Data!!!\r\n"); - BSP_UART1_Init(); - Ml307r_Gpio_Init(); - logDebug("Ml307r_Init_Finish!!!\r\n"); - if(ml307r_obj != NULL) + // 创建请求结构体 + TsIotSendRequest request; + request.cmd = cmd; + + // 将请求添加到队列 + if (lwrb_write(&iot_send_queue, &request, sizeof(request)) == sizeof(request)) { + logDebug("add to the queue\r\n"); + + // 如果当前没有发送任务在进行,则启动发送流程 + if(IotFlag_t.Date_Sending_flag == 0) { - IotFlag_t.Date_Sending_flag = 1; - IotFlag_t.module_init_flag = 1; - BSP_BlockSleep(); - ml307_task_id = TMOS_ProcessEventRegister(Ml307r_Handle); - // tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT); - tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(300)); //电流稳定后再启动模组 - }else - { - BSP_Ml307r_Init(); + BSP_UART1_Init(); + Ml307r_Gpio_Init(); + logDebug("Ml307r_Init_Finish!!!\r\n"); + if(ml307r_obj != NULL) + { + IotFlag_t.Date_Sending_flag = 1; + IotFlag_t.module_init_flag = 1; + BSP_BlockSleep(); + ml307_task_id = TMOS_ProcessEventRegister(Ml307r_Handle); + tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(300)); + }else + { + BSP_Ml307r_Init(); + } } - }else - { - logDebug("ERROR ,Iot_Send_Data!!!\r\n"); + } else { + logDebug("The queue is full\r\n"); + lwrb_reset(&iot_send_queue); } } diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c index 7adfb86..6012472 100644 --- a/bsp/src/bsp_valve.c +++ b/bsp/src/bsp_valve.c @@ -371,9 +371,12 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 闃 tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); - BSP_RequestSleep(); + if (IotFlag_t.Date_Sending_flag == 0) + { + BSP_RequestSleep(); + } logDebug("VAVLE_CLOSE_END_EVT"); - Iot_Send_Data(); + Iot_Send_Data(gValveCloseReason); return (events ^ VAVLE_CLOSE_END_EVT); } @@ -424,9 +427,12 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 闃 gValveOpenReason = kCmdOpenVavle; tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); - BSP_RequestSleep(); + if (IotFlag_t.Date_Sending_flag == 0) + { + BSP_RequestSleep(); + } - Iot_Send_Data(); + Iot_Send_Data(gValveOpenReason); // 鍚姩寰硠婕忔娴 startMicroLeakDetection(); @@ -628,7 +634,7 @@ uint8_t BSP_VALVE_Close(TeFrameCmd close_reason) // 璁剧疆鍏抽榾鍘熷洜 gValveCloseReason = close_reason; - + LED_VALVE_CLOSE; // 瑙﹀彂鍏抽榾浜嬩欢 tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); @@ -702,7 +708,7 @@ uint8_t BSP_VALVE_Open(TeFrameCmd open_reason) return 2; } gValveOpenReason = open_reason; - + LED_VALVE_OPEN; // 瑙﹀彂寮闃浜嬩欢 tmos_set_event(vavle_task_id, VAVLE_OPEN_START_EVT);