优化型号格显示
authorxue <2144439972@qq.com>
Wed, 26 Nov 2025 07:10:26 +0000 (15:10 +0800)
committerxue <2144439972@qq.com>
Wed, 26 Nov 2025 07:10:26 +0000 (15:10 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp

index be5cc06..df1c284 100644 (file)
@@ -153,6 +153,13 @@ namespace OHOS
         bool HasNetwork() const;
         bool IsNetworkStatusChanged() const;
         void SetNetworkStatusChanged(bool changed);
+        
+        // LTE信号质量获取函数 (基于AT+CESQ)
+        int GetRsrq() const;  // 获取RSRQ值 (0-34, 255=无效)
+        int GetRsrp() const;  // 获取RSRP值 (0-97, 255=无效)
+        
+        // 更新RSRQ和RSRP值(供回调函数使用)
+        void UpdateRsrqRsrp(int rsrq, int rsrp);
 
         int16_t GetCurrentView() const;
         int16_t GetCurrentSubView() const;
@@ -331,11 +338,13 @@ namespace OHOS
         // 网络状态管理
         int m_simStatus;               // SIM卡状态
         int m_cat1PowerStatus;         // CAT1电源状态
-        int m_signalStrength;          // 信号强度
+        int m_signalStrength;          // 信号强度 (旧接口,保留兼容性)
         int m_networkStatus;           // 网络状态
         int m_networkType;             // 网络类型
         bool m_hasNetwork;             // 网络连接标志位
         bool m_networkStatusChanged;   // 网络状态变化标志位
+        int m_rsrq;                    // LTE参考信号质量 (0-34, 255=无效)
+        int m_rsrp;                    // LTE参考信号接收功率 (0-97, 255=无效)
 
         bool is_all_services_ready = false;
         bool bind_status = false;
index 9cb7cbc..05ba7db 100644 (file)
@@ -1258,32 +1258,89 @@ namespace OHOS
             showSignalStrength[i]->SetVisible(state);
         }
     }
+    /**
+     * @brief 基于RSRQ和RSRP计算信号格数
+     * @param signalStrength 旧的信号强度值(保留兼容性,但不再使用)
+     * @return 信号格数 (0-4, 99=无效)
+     * @note 基于AT+CESQ命令的RSRQ和RSRP值计算
+     *       RSRQ转换: 实际值(dB) = (rsrq - 94)/10
+     *       RSRP转换: 实际值(dBm) = rsrp - 140
+     *       评估标准:
+     *       - RSRQ: >= -6.0 极佳, >= -9.0 良好, >= -12.0 一般, < -12.0 较差
+     *       - RSRP: >= -80 极佳, >= -90 良好, >= -100 一般, < -100 较差
+     */
     int ThunderBirdMainView::CalculateSignalBars(int signalStrength)
     {
-        if (signalStrength >= 1 && signalStrength <= 8) // 0信号
-        {
-            return 0;
+        // 从Model获取RSRQ和RSRP值
+        int rsrq = ThunderBirdModel::GetInstance()->GetRsrq();
+        int rsrp = ThunderBirdModel::GetInstance()->GetRsrp();
+        int signalBars = 0;
+        // 如果RSRQ或RSRP无效,回退到旧的信号强度计算方法
+        if (rsrq == 255 || rsrp == 255) {
+            // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CalculateSignalBars: RSRQ/RSRP invalid, using legacy signal strength");
+            // if (signalStrength >= 1 && signalStrength <= 8) // 0信号
+            // {
+            //     return 0;
+            // }
+            // else if (signalStrength >= 9 && signalStrength <= 16) // 1格信号
+            // {
+            //     return 1;
+            // }
+            // else if (signalStrength >= 17 && signalStrength <= 21) // 2格信号
+            // {
+            //     return 2;
+            // }
+            // else if (signalStrength >= 22 && signalStrength <= 26) // 3格信号
+            // {
+            //     return 3;
+            // }
+            // else if (signalStrength >= 27 && signalStrength <= 31) // 4格信号
+            // {
+            //     return 4;
+            // }
+            // else
+            // {
+            //     return 99; // Invalid signal strength
+            // }
+            signalBars = 0;
         }
-        else if (signalStrength >= 9 && signalStrength <= 16) // 1格信号,信号很弱偶尔可以接打电话,很容易失败
-        {
-            return 1;
+        
+        // 转换RSRQ和RSRP为实际值
+        // RSRQ转换公式: 实际值(dB) = (rsrq - 94)/10
+        // RSRP转换公式: 实际值(dBm) = rsrp - 140
+        float rsrq_db = (rsrq - 94) / 10.0f;
+        float rsrp_dbm = rsrp - 140.0f;
+        
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CalculateSignalBars: RSRQ=%d (%.1f dB), RSRP=%d (%.0f dBm)", 
+                     rsrq, rsrq_db, rsrp, rsrp_dbm);
+        
+        // 综合评估:优先考虑RSRP(信号强度),RSRQ(信号质量)作为辅助
+        // 信号格数评估标准(基于RSRP和RSRQ的综合评估)
+      
+        
+        // 极佳信号:RSRP >= -80 且 RSRQ >= -6.0
+        if (rsrp_dbm >= -80.0f && rsrq_db >= -6.0f) {
+            signalBars = 4;  // 4格信号
         }
-        else if (signalStrength >= 17 && signalStrength <= 21) // 2格信号,信号一般
-        {
-            return 2;
+        // 良好信号:RSRP >= -90 且 RSRQ >= -9.0
+        else if (rsrp_dbm >= -90.0f && rsrq_db >= -9.0f) {
+            signalBars = 3;  // 3格信号
         }
-        else if (signalStrength >= 22 && signalStrength <= 26) // 3格信号,信号较强
-        {
-            return 3;
+        // 一般信号:RSRP >= -100 且 RSRQ >= -12.0
+        else if (rsrp_dbm >= -100.0f && rsrq_db >= -12.0f) {
+            signalBars = 2;  // 2格信号
         }
-        else if (signalStrength >= 27 && signalStrength <= 31) // 4格信号,信号很强
-        {
-            return 4;
+        // 较弱信号:RSRP >= -110 或 RSRQ >= -15.0(至少有一个满足)
+        else if (rsrp_dbm >= -110.0f || rsrq_db >= -15.0f) {
+            signalBars = 1;  // 1格信号
         }
-        else
-        {
-            return 99; // Invalid signal strength
+        // 很差信号:其他情况
+        else {
+            signalBars = 0;  // 0格信号
         }
+        
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CalculateSignalBars: Calculated signal bars = %d", signalBars);
+        return signalBars;
     }
     void ThunderBirdMainView::UpdateBatteryProcess() // 电量接收及其提醒函数
     {
index c8dfd00..ad8dca3 100644 (file)
@@ -53,6 +53,11 @@ extern "C" {
 #include "dmp_api.h"
 #ifdef __cplusplus
 }
+#endif
+#ifdef SUPPORT_CAT1_SERVICE
+#include "cat1_server.h"
+#include "cat1_pub_api.h"
+#include "cat1_types.h"
 #endif
  #define JUHEPINGTAI 0
  #if JUHEPINGTAI
@@ -87,6 +92,53 @@ extern "C" {
 
      static bool g_isRecording = false;//是否正在录音
 
+     /**
+      * @brief CAT1消息回调函数,处理AT命令响应
+      * @note 用于处理MESSAGE_4G_AT_RECEIVED消息,解析+CESQ响应
+      */
+     #ifdef SUPPORT_CAT1_SERVICE
+     extern "C" {
+     #endif
+     static errcode_t ThunderBirdModel_Cat1MsgCallback(MESSAGE_4G_T msg, void *msg_buf, uint16_t msglen)
+     {
+         if (msg == MESSAGE_4G_AT_RECEIVED && msg_buf != nullptr && msglen > 0)
+         {
+             const char *response = (const char *)msg_buf;
+             
+             // 查找+CESQ响应: +CESQ: <rxlev>,<ber>,<rscp>,<ecno>,<rsrq>,<rsrp>
+             const char *cesq_line = strstr(response, "+CESQ:");
+             if (cesq_line != nullptr)
+             {
+                 // 跳过"+CESQ:"
+                 cesq_line += 6;
+                 while (*cesq_line == ' ' || *cesq_line == '\t') cesq_line++;
+                 
+                 // 解析6个参数: rxlev, ber, rscp, ecno, rsrq, rsrp
+                 int rxlev = 99, ber = 99, rscp = 255, ecno = 255, rsrq = 255, rsrp = 255;
+                 int parsed = sscanf(cesq_line, "%d,%d,%d,%d,%d,%d", &rxlev, &ber, &rscp, &ecno, &rsrq, &rsrp);
+                 
+                 if (parsed == 6)
+                 {
+                     ThunderBirdModel *model = ThunderBirdModel::GetInstance();
+                     if (model != nullptr)
+                     {
+                         // 更新RSRQ和RSRP值
+                         model->UpdateRsrqRsrp(rsrq, rsrp);
+                         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel: CESQ response parsed - RSRQ=%d, RSRP=%d", rsrq, rsrp);
+                     }
+                 }
+                 else
+                 {
+                     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel: Failed to parse CESQ response, parsed: %d", parsed);
+                 }
+             }
+         }
+         return ERRCODE_SUCC;
+     }
+     #ifdef SUPPORT_CAT1_SERVICE
+     }
+     #endif
+
      ThunderBirdModel::ThunderBirdModel() : m_nextReminderId(1), m_otaStatus(0),
                                            m_timeDisplayTimer(nullptr), m_statusTimer(nullptr),
                                            m_currentStatus(DeviceStatus::IDLE), 
@@ -97,7 +149,8 @@ extern "C" {
                                            m_currentFps(60),  // 默认60FPS
                                            m_simStatus(0), m_cat1PowerStatus(0), m_signalStrength(0),
                                            m_networkStatus(0), m_networkType(0),
-                                           m_hasNetwork(false), m_networkStatusChanged(false)
+                                           m_hasNetwork(false), m_networkStatusChanged(false),
+                                           m_rsrq(255), m_rsrp(255)
      {
          //设置屏幕亮度为20
         //  cm_set_brightness(20);
@@ -132,6 +185,12 @@ extern "C" {
          // 初始化对话状态显示变量
          m_currentExpression = "CloseEyes";
          m_currentStatusText = "发呆中...";
+         
+         // 注册CAT1消息回调函数,用于处理AT命令响应(如+CESQ)
+         #ifdef SUPPORT_CAT1_SERVICE
+         cat1_register_msg_callback(ThunderBirdModel_Cat1MsgCallback);
+         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel: CAT1 message callback registered");
+         #endif
 
          RegisterAllKeyEvents();
      }
@@ -1861,6 +1920,37 @@ extern "C" {
         return m_networkType;
     }
 
+    /**
+     * @brief 获取RSRQ值 (LTE参考信号质量)
+     * @return RSRQ值 (0-34有效, 255=无效)
+     * @note 基于AT+CESQ命令获取
+     */
+    int ThunderBirdModel::GetRsrq() const
+    {
+        return m_rsrq;
+    }
+
+    /**
+     * @brief 获取RSRP值 (LTE参考信号接收功率)
+     * @return RSRP值 (0-97有效, 255=无效)
+     * @note 基于AT+CESQ命令获取
+     */
+    int ThunderBirdModel::GetRsrp() const
+    {
+        return m_rsrp;
+    }
+
+    /**
+     * @brief 更新RSRQ和RSRP值(供回调函数使用)
+     * @param rsrq LTE参考信号质量 (0-34, 255=无效)
+     * @param rsrp LTE参考信号接收功率 (0-97, 255=无效)
+     */
+    void ThunderBirdModel::UpdateRsrqRsrp(int rsrq, int rsrp)
+    {
+        m_rsrq = rsrq;
+        m_rsrp = rsrp;
+    }
+
     /**
      * @brief 更新网络状态信息
      * @details 从底层API获取最新的网络状态信息,并检测状态变化
@@ -1885,9 +1975,24 @@ extern "C" {
         #if defined(SUPPORT_CAT1_SERVICE) || defined(SUPPORT_PPP_SERVICE)
         m_simStatus = uapi_dev_runtime_get_cat1_simstat();           // SIM卡状态
         m_cat1PowerStatus = uapi_dev_runtime_get_cat1_powerstat();   // CAT1电源状态
-        m_signalStrength = uapi_dev_runtime_get_cat1_signal();       // 信号强度
+        m_signalStrength = uapi_dev_runtime_get_cat1_signal();       // 信号强度 (旧接口,保留兼容性)
         m_networkStatus = uapi_dev_runtime_get_cat1_networkstat();   // 网络连接状态
         m_networkType = uapi_dev_runtime_get_cat1_networtype();      // 网络类型
+        
+        // 使用AT+CESQ获取LTE信号质量信息 (RSRQ和RSRP)
+        // 通过cat1_at_cmd发送AT+CESQ命令,响应通过ThunderBirdModel_Cat1MsgCallback回调处理
+        #ifdef SUPPORT_CAT1_SERVICE
+        // 发送AT+CESQ命令获取信号质量信息
+        // 命令格式: AT+CESQ\r\n
+        // 响应会通过MESSAGE_4G_AT_RECEIVED回调返回,在ThunderBirdModel_Cat1MsgCallback中解析
+        static char cesq_cmd[] = "AT+CESQ\r\n";
+        cat1_at_cmd(cesq_cmd);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel: AT+CESQ command sent via cat1_at_cmd");
+        // 注意:m_rsrq和m_rsrp会在回调函数中更新,这里不设置默认值(保持上次的值)
+        #else
+        // 如果没有CAT1服务,设置为无效值
+        m_rsrq = 255;
+        m_rsrp = 255;
         #endif
         
         // 更新网络连接标志位:m_networkStatus == 1表示有网络连接
@@ -1910,6 +2015,7 @@ extern "C" {
         // 记录网络状态更新日志
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Network status updated: sim=%d, power=%d, signal=%d, network=%d, type=%d, hasNetwork=%d", 
                      m_simStatus, m_cat1PowerStatus, m_signalStrength, m_networkStatus, m_networkType, m_hasNetwork);
+        #endif  // #if defined(SUPPORT_CAT1_SERVICE) || defined(SUPPORT_PPP_SERVICE)
     }
 
     /**