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;
// 网络状态管理
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;
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() // 电量接收及其提醒函数
{
#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
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),
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);
// 初始化对话状态显示变量
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();
}
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获取最新的网络状态信息,并检测状态变化
#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表示有网络连接
// 记录网络状态更新日志
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)
}
/**