Browse Source

1. 设置当空管且nb上报时,rtc 1秒中断一次,友好界面.
2. 修复获取4G信号质量的相关代码, 基站id恢复32位值,
3. 设置当进行底读修改时, 根据修改的数据情况进行结算处理
4. 修复5min存日期时的bug

wxl 15 hours ago
parent
commit
de3c76dabd
7 changed files with 224 additions and 150 deletions
  1. 2 2
      Drivers/Board/board.h
  2. 86 55
      Users/app_nb/app_nb.c
  3. 4 2
      Users/app_nb/app_nb.h
  4. 39 8
      Users/bill/bill.c
  5. 2 1
      Users/bill/bill.h
  6. 44 41
      Users/main.c
  7. 47 41
      Users/param/param.c

+ 2 - 2
Drivers/Board/board.h

@@ -23,7 +23,7 @@
 
 #define BOOTLOADER_ENABLE // 从0x0000启动运行时,屏蔽该宏
 
- #define APP_DEBUG_PRINT // 调试打印开关
+ //#define APP_DEBUG_PRINT // 调试打印开关
 
 // #define DEBUG_LOW_POWER
 //#define DOG_ENABLE // WXL2026-5-12
@@ -37,7 +37,7 @@
 //  #define DEBUG_LOG_WARM
 //  #define DEBUG_PARAM
 //  #define DEBUG_PATCH
-  #define DEBUG_NB
+//  #define DEBUG_NB
 //   #define DEBUG_BILL2
 //   #define DEBUG_BILL
 //   add by yuewei 20260305 end

+ 86 - 55
Users/app_nb/app_nb.c

@@ -9,6 +9,10 @@
 #include "alarm.h"
 #include "stat.h"
 #include "ymodem.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
 
 Nb_Run_t NbRun;
 uint8_t NB_CHECK_TDC_COMPLETE_FLAG = 0;
@@ -1479,20 +1483,23 @@ void NbTread(void)
             break;                                                 //
         if (at_cmd_send(npos++, NB_ATE0, NB_ATE0_ACK, 3, 2) == -1) // 关闭回显
             break;
-				/////////////设置频段//////////////////////////
-				if(Paramx.nb_band_flag!=0)
-				{if (at_cmd_send(npos++, "AT+QCFG=\"band\",0,0x10,0,1\r\n", NB_AT_ACK, 3, 5) == -1)
-            break;
-				set_nb_band();
-        if (at_cmd_send(1, NB_CFUN0, NB_AT_ACK, 3, 3) == -1)
-            break;
-        rt_thread_mdelay(1000);
-        if (at_cmd_send(1, NB_CFUN1, NB_AT_ACK, 3, 3) == -1)
-            break;
-        rt_thread_mdelay(1200);
-				
-			}
-				//////////////////////////////////////////
+        /////////////设置频段//////////////////////////
+        if (Paramx.nb_band_flag != 0)
+        {
+            // if (at_cmd_send(npos++, "AT+QCFG=\"band\",0,0x10,0,1\r\n", NB_AT_ACK, 3, 5) == -1)
+            //   break;
+            if (at_cmd_send(npos++, "AT+QCFG=\"band\",0,0x008800D5,0,1\r\n", NB_AT_ACK, 3, 5) == -1)
+                break;
+
+            set_nb_band();
+            if (at_cmd_send(1, NB_CFUN0, NB_AT_ACK, 3, 3) == -1)
+                break;
+            rt_thread_mdelay(1000);
+            if (at_cmd_send(1, NB_CFUN1, NB_AT_ACK, 3, 3) == -1)
+                break;
+            rt_thread_mdelay(1200);
+        }
+        //////////////////////////////////////////
         // if (at_cmd_send(1, NB_CFUN0, NB_AT_ACK, 3, 2) == -1)
         //     break;
         // rt_thread_mdelay(1000);
@@ -1650,7 +1657,7 @@ void NbTread(void)
             // get_nb_csq();
             ncnt = 5;
             vflag = 1;
-            while (ncnt--) // 查询无线信号强度 BC800有
+            while (ncnt--) // 查询无线信号强度 EC800有
             {
                 if (at_cmd_send(npos++, "AT+QENG=\"servingcell\"\r\n", "+QENG: \"servingcell\"", 3, 2) == -1)
                 {
@@ -1670,6 +1677,8 @@ void NbTread(void)
                 break;
             if (at_cmd_send(npos++, "AT+QIACT?\r\n", "+QIACT: 1,1", 3, 3) == -1) // 查询场景激活状态
                 break;
+
+#ifdef NB_AUTO_GET_NET_TIME
             if ((NbRun.upload.mode & NB_UPLOAD_TIMER) != 0)
             {
                 if (at_cmd_send(npos, "AT+QNTP=1,\"202.112.10.36\",123\r\n", "+QNTP: 0,", 1, 15) == 0)
@@ -1678,6 +1687,7 @@ void NbTread(void)
                     LOG("get net time!\t\n");
                 }
             }
+#endif
             npos++;
             int16_t link_code;
             vflag = 0x80;
@@ -2190,16 +2200,16 @@ static void BuildDataReportNb(uint8_t *data)
     // cell id in AT+NUESTATS response
     data[8] = (unsigned char)(nb_run->bts_id);
     data[9] = (unsigned char)(nb_run->bts_id >> 8);
-    data[10] = 0x00;
-    data[11] = 0x00;
+    data[10] = (unsigned char)(nb_run->bts_id >> 16);
+    data[11] = (unsigned char)(nb_run->bts_id >> 24);
 
     // physical cell id
     data[12] = (unsigned char)(nb_run->physical_cell_id);
     data[13] = (unsigned char)(nb_run->physical_cell_id >> 8);
 
     // rsrp
-    data[14] = (unsigned char)(nb_run->rsrp);
-    data[15] = (unsigned char)(nb_run->rsrp >> 8);
+    data[14] = (unsigned char)(nb_run->rsrp_bak);
+    data[15] = (unsigned char)(nb_run->rsrp_bak >> 8);
 
     // snr
     data[16] = (unsigned char)(nb_run->snr);
@@ -2708,55 +2718,76 @@ void save_datetime_from_at(uint8_t *buf, uint16_t dat_len)
     }
     tm.year %= 100;
     SetRtcTime(&tm);
+    save_cur_flow_flag = 1;
 }
 
 //+QENG: "servingcell","NOCONN","LTE","FDD",460,11,EA6CE03,77,100,1,5,5,EA15,-94,-8,-66,24,26
 //                                                                           rsrp rwrq rssi sinr
 uint8_t get_nb_signal(uint8_t *buf, uint16_t dat_len)
 {
-    char temp[8];
-    char *p;
-    int8_t index1 = 0, index2 = 0;
-    int16_t *out_val = NULL;
-    uint8_t ret = 0;
-
-    buf[dat_len] = 0; // 确保终止位
-    p = strstr((char *)buf, "servingcell");
-    if (p == NULL)
+    // 确保数据包含预期的关键字
+    if (buf == NULL || strstr((char *)buf, "+QENG: \"servingcell\"") == NULL)
+    {
         return 0;
+    }
 
-    index1 = strnchar(p, ',', 12);
+    char temp[256] = {0};
+    memcpy(temp, buf, sizeof(temp) - 1);
 
-    // 依次提取 rsrp_bak, rsrq, rssi, snr
-    for (uint8_t i = 0; i < 4; i++)
+    char *token = NULL;
+    char *tokens[20]; // 足足够容纳所有分割的子字符串
+    int count = 0;
+
+    // 使用 strtok 按逗号分割字符串
+    token = strtok(temp, ",");
+    while (token != NULL && count < 20)
     {
-        if (index1 == -1)
-            break; // 上一次查找失败,直接退出
+        tokens[count++] = token;
+        token = strtok(NULL, ",");
+    }
 
-        index2 = strnchar(p, ',', 13 + i);
-        if (index2 != -1 && index1 < index2)
-        {
-            memset(temp, 0, sizeof(temp));
-            memcpy(temp, p + index1 + 1, index2 - index1 - 1);
+    // 根据您提供的格式,各字段在分割后的索引如下:
+    // [0] +QENG: "servingcell"
+    // [1] "NOCONN"
+    // [2] "LTE"
+    // [3] "FDD"
+    // [4] 460
+    // [5] 11
+    // [6] 9C8C712      -> 基站id (需转为uint32_t)
+    // [7] 119          -> 物理小区id
+    // [8] 2452
+    // [9] 5
+    // [10] 3
+    // [11] 3
+    // [12] EA15
+    // [13] -85         -> 参考信号接收功率
+    // [14] -15         -> 参考信号接收质量
+    // [15] -53         -> 接收信号强度指示
+    // [16] 0           -> SINR (有效范围 -20~40)
 
-            int16_t val = atoi(temp);
-            switch (i)
-            {
-            case 0:
-                NbRun.rsrp_bak = val;
-                break;
-            case 1:
-                NbRun.rsrq = val;
-                break;
-            case 2:
-                NbRun.rssi = val;
-                ret = 1;
-                break;
-            }
-        }
-        index1 = index2; // 将当前的右边界作为下一次的左边界
+    // 确保分割出的字段数量足够
+    if (count > 16)
+    {
+        // 基站id是16进制字符串,使用 strtoul 转换为 32位无符号数
+        NbRun.bts_id = (uint32_t)strtoul(tokens[6], NULL, 16);
+
+        // 物理小区id是10进制数
+        NbRun.physical_cell_id = (uint32_t)atoi(tokens[7]);
+
+        // 参考信号接收功率
+        NbRun.rsrp_bak = atoi(tokens[13]);
+
+        // 参考信号接收质量
+        NbRun.rsrq = atoi(tokens[14]);
+
+        // 接收信号强度指示
+        NbRun.rssi = atoi(tokens[15]);
+
+        // SINR
+        NbRun.snr = atoi(tokens[16]);
+        return 1;
     }
-    return ret;
+    return 0;
 }
 uint8_t check_sub_service_flag(void)
 {

+ 4 - 2
Users/app_nb/app_nb.h

@@ -17,6 +17,8 @@ extern "C"
 #define MB_MAX_RETRY_GATT_QUERY_TIME 4
 #define QUERY_RETRY_TIME 90
 
+//#define NB_AUTO_GET_NET_TIME	//×Ô¶¯»ñÈ¡ÍøÂçʱ¼ä
+	
 #define NB_FLAG_ARG_VLD (0x0001u)
 
 #define NB_AT "AT\r\n"
@@ -210,14 +212,14 @@ extern "C"
     // uint16_t open_time_out;
     // uint16_t reset_count;
 
-    uint16_t bts_id;
+    uint32_t bts_id;
     uint16_t physical_cell_id;
     int16_t rsrq;
     int16_t rsrp;
     int16_t rsrp_bak;
 
     int16_t snr;
-    uint8_t rssi;
+    int8_t rssi;
     char imsi[20];
     char imei[20];
     char ccid[32];

+ 39 - 8
Users/bill/bill.c

@@ -16,7 +16,7 @@ res_bill_t bak_day_cum_flow;
 res_bill_t bak_hour_cum_flow;
 bill_5min_ctrl_def bak_5min_cum_flow;
 uint8_t StartUp = 0;
-
+uint8_t global_settle_flag = 0;
 void bill_init(void)
 {
 	BillRun.fw_use_hour = 0.0f;
@@ -302,14 +302,25 @@ void set_5min_used_bill(uint8_t year, uint8_t month, uint8_t day, uint8_t hour,
 // 无返回值
 // 256点循环保存,最快10秒一次, 最慢5分钟一次
 ///////////////////////////////////////////////////////////////////////
+uint8_t save_5min_trik_flag = 0;
 void save_cur_flow_bill(void)
 {
 
 	rtc_run_t *rr;
 	bill_cum_flow_tx bill;
-
+	if (global_settle_flag == 1) // 结算中,只有结算完成才保存新的底读
+		return;
 	get_rtc_run(&rr); // 获取当前时间
-	if ((rr->minute % 5 == 0 && rr->second == 0) || ((BillRun.fw_cum_flow != cum_flow_index.fw || BillRun.bw_cum_flow != cum_flow_index.bw) && rr->second /*% 10*/ == 0) || save_cur_flow_flag == 1)
+	if (rr->minute % 5 == 0)
+	{
+		save_5min_trik_flag++;
+	}
+	else
+	{
+		save_5min_trik_flag = 0;
+	}
+
+	if ((save_5min_trik_flag == 1) || ((BillRun.fw_cum_flow != cum_flow_index.fw || BillRun.bw_cum_flow != cum_flow_index.bw) && rr->second /*% 10*/ == 0) || save_cur_flow_flag == 1)
 	{ // 整5分钟或流量值发生变化
 	}
 	else
@@ -839,11 +850,31 @@ tm_t prev_hour(tm_t *date)
 	ndate.year = (uint8_t)(sdate >> 16);
 	return ndate;
 }
-void get_cur_flow_data(void)
+void get_cur_flow_data(tm_t *ntm)
 {
-	BillRun.fw_cum_flow = FwCumFlow;
-	BillRun.bw_cum_flow = BwCumFlow;
-	BillRun.flow_rate = FlowVol;
+	if (global_settle_flag != 0) // 在设置更新的底读之前,先进行结算
+	{
+		global_settle_flag = 0;
+		set_month_used_bill(ntm->year, ntm->month, ntm->day);					  // 设置月度已用账单
+		set_day_used_bill(ntm->year, ntm->month, ntm->day);						  // 设置日度已用账单
+		set_hour_used_bill(ntm->year, ntm->month, ntm->day, ntm->hour);			  // 设置小时已用账单
+		set_5min_used_bill(ntm->year, ntm->month, ntm->day, ntm->hour, ntm->min); // 设置5分钟已用账单
+
+		BillRun.fw_cum_flow = FwCumFlow; // 设置正向累计流量
+		BillRun.bw_cum_flow = BwCumFlow;
+		BillRun.flow_rate = FlowVol;
+
+		set_month_cur_flow_bill();
+		set_day_cur_flow_bill();
+		set_hour_cur_flow_bill();
+		set_5min_cur_flow_bill();
+	}
+	else
+	{
+		BillRun.fw_cum_flow = FwCumFlow;
+		BillRun.bw_cum_flow = BwCumFlow;
+		BillRun.flow_rate = FlowVol;
+	}
 }
 
 void app_bill_run(void)
@@ -876,7 +907,7 @@ void app_bill_run(void)
 	get_now_time(&ntm);
 
 	// 获取当前流量数据,用于计算差值
-	get_cur_flow_data();
+	get_cur_flow_data(&ntm);
 
 	////////////////////////////////// 月使用量记录 //////////////////////////////////
 	// 判断依据:当前时间的年或月 与 备份的年月不一致

+ 2 - 1
Users/bill/bill.h

@@ -202,7 +202,8 @@ extern "C"
     extern void clear_all_record(void); // Çå³ýËùÓмǼ
     extern void clear_log(void);        // Çå³ýlog
     extern void clear_bottom_data(void);
-    extern void get_cur_flow_data(void);
+    extern void get_cur_flow_data(tm_t *);
+    extern uint8_t global_settle_flag;
     extern uint8_t StartUp;
 #ifdef DEBUG_BILL
     extern void verify_clear_operations(void);

+ 44 - 41
Users/main.c

@@ -43,14 +43,14 @@
 #define KEY_SLEEP_BLOCK_MS 800      // 按键后延迟允许休眠时间
 
 /* 全局变量(仅保留必要的) */
-struct rt_semaphore lcd_isr_sem;       // lcd 中断信号量
-struct rt_semaphore rtc_isr_sem;       // rtc 中断信号量
-struct rt_semaphore tdc_isr_sem;       // TDC 中断信号量:中断->线程通知
-static rt_timer_t key_timer = RT_NULL; // 按键计时定时器
-static uint32_t key_press_time = 0;    // 按键按下时长(ms)
+struct rt_semaphore lcd_isr_sem;               // lcd 中断信号量
+struct rt_semaphore rtc_isr_sem;               // rtc 中断信号量
+struct rt_semaphore tdc_isr_sem;               // TDC 中断信号量:中断->线程通知
+static rt_timer_t key_timer = RT_NULL;         // 按键计时定时器
+static uint32_t key_press_time = 0;            // 按键按下时长(ms)
 volatile rt_tick_t g_key_last_active_tick = 0; // add by HBR 20260623,按键最后活动时间,用于睡眠门禁
-uint8_t KEY_SHORT_PRESS_FLAG = 0;      // 短按标志,用于翻屏
-uint8_t KEY_LONG_PRESS_FLAG = 0;       // 长按标志,用于触发上报
+uint8_t KEY_SHORT_PRESS_FLAG = 0;              // 短按标志,用于翻屏
+uint8_t KEY_LONG_PRESS_FLAG = 0;               // 长按标志,用于触发上报
 /************************** 线程配置 **************************/
 #define TDC_THREAD_STACK 1024 // 核心线程栈1K,满足需求 堆栈大小
 #define TDC_THREAD_PRIORITY 1 // 高优先级,确保及时响应
@@ -139,20 +139,26 @@ void PeriodProc(void) // 
         rr->flag_1s = 0;
 
         // add by yuewei 20260519 start
-        if (alarm_status(ERR_BLANK_PIPE))
+        if (!alarm_status(ERR_BLANK_PIPE)) // 非空管状态
         {
-            // 空管,设置RTC中断2秒1次
-            if ((uint8_t)get_rtc_interrupt_time() != 2)
+            // 不是空管,设置RTC中断0.5秒1次
+            if ((get_rtc_interrupt_time() == 2) || (get_rtc_interrupt_time() == 1))
             {
-                set_rtc_interrupt_time(2);
+                set_rtc_interrupt_time(0.5); // 0.5
             }
         }
-        else
+        else if (G_NB_CAN_DEEP_SLEEP == 0) // 空管,正在上报
         {
-            // 不是空管,设置RTC中断0.5秒1次
-            if ((get_rtc_interrupt_time() == 2) || (get_rtc_interrupt_time() == 1))
+            if ((uint8_t)get_rtc_interrupt_time() != 1)
             {
-                set_rtc_interrupt_time(0.5); // 0.5
+                set_rtc_interrupt_time(1);
+            }
+        }
+        else // 空管,无上报
+        {
+            if ((uint8_t)get_rtc_interrupt_time() != 2)
+            {
+                set_rtc_interrupt_time(2);
             }
         }
         // add by yuewei 20260519 start
@@ -244,8 +250,8 @@ uint8_t key_irq_handler(void) // WXL2026-5-22
         if (GpioInPins(GpioPortD, GpioBitMsk4) != 0)
         {
             key_press_time = 0;
-            G_KEY_CAN_DEEP_SLEEP = 0; // 按键不允许休眠          
-            g_key_last_active_tick = rt_tick_get();                 //add by HBR 20260623,按键中断触发记录一次时间
+            G_KEY_CAN_DEEP_SLEEP = 0;               // 按键不允许休眠
+            g_key_last_active_tick = rt_tick_get(); // add by HBR 20260623,按键中断触发记录一次时间
 
             rt_timer_stop(key_timer);
             rt_timer_start(key_timer);
@@ -265,9 +271,9 @@ static void key_timer_cb(void *param)
 
     if (GpioInPins(GpioPortD, GpioBitMsk4) == 0) // WXL2026-5-20
     {
-        rt_timer_stop(key_timer); // 停止计时
-        G_KEY_CAN_DEEP_SLEEP = 0; // modify by HBR 20260622,按键,不允许休眠
-        g_key_last_active_tick = rt_tick_get();                //add by HBR 20260622,判断出短按记录一次时间
+        rt_timer_stop(key_timer);               // 停止计时
+        G_KEY_CAN_DEEP_SLEEP = 0;               // modify by HBR 20260622,按键,不允许休眠
+        g_key_last_active_tick = rt_tick_get(); // add by HBR 20260622,判断出短按记录一次时间
         // 核心:判断长短按
         if (key_press_time >= SHORT_PRESS_MS && key_press_time < LONG_PRESS_MS)
         {
@@ -300,10 +306,10 @@ static void rtc_business_thread(void *parameter)
         if (rt_sem_take(&rtc_isr_sem, RT_WAITING_FOREVER) == RT_EOK)
         {
             rtc_interrupt_deal_tdc();
-            //add by HBR 20260617 to deal static ot count do not display when set stativ ot
-            if(G_STATIC_OT_SETTING_FLAG == 1)
+            // add by HBR 20260617 to deal static ot count do not display when set stativ ot
+            if (G_STATIC_OT_SETTING_FLAG == 1)
             {
-                rt_sem_release(&lcd_isr_sem); 
+                rt_sem_release(&lcd_isr_sem);
             }
         }
     }
@@ -364,7 +370,7 @@ static void tdc_business_thread(void *parameter)
             // rt_thread_mdelay(15);
             rtc_run_t *rr;
             get_rtc_run(&rr);
-					#ifdef DEBUG_TDC
+#ifdef DEBUG_TDC
             LOG("Diff=%.6f, AvgDiff=%.6f, T=%.6f, vol=%.6f\n", SerPlot.f.Data[0], SerPlot.f.Data[3], WaterPrmt[0], FlowVol * 0.000001f * 3600);
             // LOG("diff=%.6f, U=%.6f, D=%.6f\n", SerPlot.f.Data[0], SerPlot.f.Data[1], SerPlot.f.Data[2]);
             rt_thread_mdelay(4);
@@ -540,10 +546,10 @@ int32_t main(void)
     ButtonInit();     // 初始化磁组按键
     tdc_tof_init();   // ms1030 spi驱动
 
-    finsh_drv_init();   // 红外串口初始化波特率2400、8位数据、1位停止位、even偶校验
+    finsh_drv_init();    // 红外串口初始化波特率2400、8位数据、1位停止位、even偶校验
     lpuart0_drv_init(0); // NB串口初始化波特率9600、8位数据、1位停止位、none校验
-    nb_run_init();      // NB运行数据初始化
-    McuFlash_init();    // FLASH读写初始化
+    nb_run_init();       // NB运行数据初始化
+    McuFlash_init();     // FLASH读写初始化
 
 #ifdef APP_DEBUG_PRINT
     debug_uart_init(); // 初始化调试打印接口,波特率9600、8位数据、1位停止位、none校验
@@ -569,7 +575,7 @@ int32_t main(void)
     rtc_init(rr);     // 设置RTC系统时钟源为外部32K(ms1030),同时设置定时中断为1秒钟一次
 
     set_tof_state(TOF_ST_VOID); // 设置ms1030状态,降低功耗
-//    // set_tof_state(TOF_ST_METER);
+                                //    // set_tof_state(TOF_ST_METER);
 
     ParamInit(); // 初始化全局变量参数
 
@@ -616,32 +622,29 @@ int32_t main(void)
     rt_sem_init(&lcd_isr_sem, "lcd_isr", 0, RT_IPC_FLAG_PRIO);
 
     rt_exit_critical(); ////!!!!!do not delete!!!!!!
-//    us_delay(10000);
-//    nb_tx_str(NB_AT);
-//    us_delay(10000);
-//    nb_tx_str(NB_AT);
-//    us_delay(10000);
- 
-    
+                        //    us_delay(10000);
+                        //    nb_tx_str(NB_AT);
+                        //    us_delay(10000);
+                        //    nb_tx_str(NB_AT);
+                        //    us_delay(10000);
+
     while (1)
     {
         PeriodProc();
 
         CheckRxHandler(); // 红外接收指令处理
 
-
         // 翻屏
         if (KEY_SHORT_PRESS_FLAG == 1)
-        {       
+        {
 
-            
             key_handle_runing = 1;
 
             if (GetCheckState() == CHECKING)
             {
                 // add by yuewei 20260416 to toggle display fw and bw cumflow in checking mode
                 g_lcd_display_check_bw_cum_flow = ~g_lcd_display_check_bw_cum_flow;
-                rt_sem_release(&lcd_isr_sem);    //add by HBR 20260622
+                rt_sem_release(&lcd_isr_sem); // add by HBR 20260622
             }
             else
             {
@@ -695,9 +698,9 @@ int32_t main(void)
         //				show_stack_by_name("main");
         //				show_stack_by_name("lcd_thread");
         //				show_stack_by_name("nb_thread");
-        if ((G_KEY_CAN_DEEP_SLEEP == 0) &&                              //add by HBR 20260623
+        if ((G_KEY_CAN_DEEP_SLEEP == 0) && // add by HBR 20260623
             (key_press_time == 0) &&
-            (rt_tick_get() - g_key_last_active_tick > rt_tick_from_millisecond(KEY_SLEEP_BLOCK_MS)))   //按键按下后延迟800ms并且按键计数为0后,才进入休眠
+            (rt_tick_get() - g_key_last_active_tick > rt_tick_from_millisecond(KEY_SLEEP_BLOCK_MS))) // 按键按下后延迟800ms并且按键计数为0后,才进入休眠
         {
             G_KEY_CAN_DEEP_SLEEP = 1;
         }

+ 47 - 41
Users/param/param.c

@@ -420,43 +420,43 @@ uint8_t CheckCValueIndex(uint16_t temp_idx, uint16_t spdLvl)
 #endif
 uint8_t CheckCValueIndex(uint16_t temp_idx, uint16_t spdLvl)
 {
-    // 1. 温度区间安全限界,仅0/1/2有效
-    if (temp_idx >= 3)
-    {
-        return 0;
-    }
+	// 1. 温度区间安全限界,仅0/1/2有效
+	if (temp_idx >= 3)
+	{
+		return 0;
+	}
 
-    CheckSpdLvlC_t *p = &Paramx.check_spdLvl_c[temp_idx];
-    uint8_t i;
-    uint8_t best_idx = 0;
-    uint16_t min_diff;
-    uint16_t curr_diff;
-
-		spdLvl = spdLvl - 5;//add by yuewei 20260629
-		
-    // 初始化最小差值为第一个点差值
-    if (spdLvl >= p->spd_lvl[0])
-        min_diff = spdLvl - p->spd_lvl[0];
-    else
-        min_diff = p->spd_lvl[0] - spdLvl;
-
-    // 遍历所有速度点,寻找差值最小的下标
-    for (i = 1; i < CHECK_POINT_NUM; i++)
-    {
-        if (spdLvl >= p->spd_lvl[i])
-            curr_diff = spdLvl - p->spd_lvl[i];
-        else
-            curr_diff = p->spd_lvl[i] - spdLvl;
-
-        // 更新最小差值与最优索引
-        if (curr_diff < min_diff)
-        {
-            min_diff = curr_diff;
-            best_idx = i;
-        }
-    }
+	CheckSpdLvlC_t *p = &Paramx.check_spdLvl_c[temp_idx];
+	uint8_t i;
+	uint8_t best_idx = 0;
+	uint16_t min_diff;
+	uint16_t curr_diff;
+
+	spdLvl = spdLvl - 5; // add by yuewei 20260629
 
-    return best_idx;
+	// 初始化最小差值为第一个点差值
+	if (spdLvl >= p->spd_lvl[0])
+		min_diff = spdLvl - p->spd_lvl[0];
+	else
+		min_diff = p->spd_lvl[0] - spdLvl;
+
+	// 遍历所有速度点,寻找差值最小的下标
+	for (i = 1; i < CHECK_POINT_NUM; i++)
+	{
+		if (spdLvl >= p->spd_lvl[i])
+			curr_diff = spdLvl - p->spd_lvl[i];
+		else
+			curr_diff = p->spd_lvl[i] - spdLvl;
+
+		// 更新最小差值与最优索引
+		if (curr_diff < min_diff)
+		{
+			min_diff = curr_diff;
+			best_idx = i;
+		}
+	}
+
+	return best_idx;
 }
 
 // 获取在不同温度和流速等级下的,声速修正系数
@@ -797,7 +797,7 @@ int8_t get_server_ip_port_para(SERVER_IP_PORT_DEF *server_ip_para)
 	return 0;
 }
 ////////////////////////////设置定时上报周期和时间间隔/////////////////////////////////////////////////////
-//                                                                  参数:regular_report_para定时上报数据结构体,包含起始基准时间,间隔时间u\
+//                                                                   参数:regular_report_para定时上报数据结构体,包含起始基准时间,间隔时间u\
 //返回:1:成功2:失败
 /////////////////////////////////////////////////////////////////////////////////////////////////////////
 int8_t set_regular_report_para(REGULAR_REPORT_DEF *regular_report_para)
@@ -986,7 +986,9 @@ int8_t set_meter_bottom_data(METER_BOTTOM_DEF *bottom_data)
 										  (bottom_data->fw[2] << 16) |
 										  (bottom_data->fw[1] << 8) |
 										  bottom_data->fw[0]);
-	base_read *= 10000;	   // 0.01->0.000001//转换为0.000001单位
+	base_read *= 10000; // 0.01->0.000001//转换为0.000001单位
+	if (base_read < FwCumFlow)
+		flag = 1;
 	FwCumFlow = base_read; // 更新当前流量和正向流量
 
 	base_read = (double)(uint32_t)((bottom_data->bw[3] << 24) |
@@ -994,12 +996,16 @@ int8_t set_meter_bottom_data(METER_BOTTOM_DEF *bottom_data)
 								   (bottom_data->bw[1] << 8) |
 								   bottom_data->bw[0]);
 	base_read *= 10000; // 0.01->0.000001//转换为0.000001单位
+	if (base_read < BwCumFlow)
+		flag = 1;
 	BwCumFlow = base_read;
 
 	CumFlow = FwCumFlow - BwCumFlow;
+	if (flag == 1)
+		global_settle_flag = 1; // 设置总结算标志
+	// SetBillCumFlow(CumFlow, FwCumFlow, BwCumFlow); // 设置当前流量数据
+	save_cur_flow_flag = 1; // 保存到当前值,循环存储
 
-	SetBillCumFlow(CumFlow, FwCumFlow, BwCumFlow); // 设置当前流量数据
-	save_cur_flow_flag = 1;						   // 保存到当前值,循环存储
 	return 0;
 }
 ////////////////////////读取前18个月月结数据//////////////////////////////////////////
@@ -1475,7 +1481,7 @@ int8_t set_skew_para(SKEW_PARA_DEF *skew_para)
 int8_t set_nb_band(void)
 {
 	uint8_t flag = 0, ret = 0;
-	uint8_t dat=0;
+	uint8_t dat = 0;
 	// 判断数据是否在正常范围内
 	ret = set_para_if_nessary(&dat, &Paramx.nb_band_flag, 1, &flag); // 参数整体保存
 	if (flag == 1)
@@ -1529,7 +1535,7 @@ uint8_t rtc_1s_flag;
 void run_clk_task_handler(void)
 {
 	check_rewrite_para(); // 相关参数判断,不合法的重写eeprom
-	rtc_1s_flag=1;
+	rtc_1s_flag = 1;
 }
 //////////////////////////////////////
 ///////////检查是否是新app第一次运行,如果是,则更新flash中的运行信息//////////////////