Android 信号格客制化问题处理

[Android Q]

信号强度客制化代码位置:

NR(5G)CellSignalStrengthNr.java updateLevel()
LTEMtkSignalStrength.java updateMtkLteLevel()
WCDMA/UMTSCellSignalStrengthWcdma.java updateLevel()
TDSCDMACellSignalStrengthTdscdma.java updateLevel()
GSMCellSignalStrengthGsm.java updateLevel()
CDMACellSignalStrengthCdma.java updateLevel()

 

[信号上报过程简介]

modem底层信号数据 → modem L4中转化为Asu并上报信号强度dbm值 → 在AP端将Asu或dbm值映射成信号格数从底层物理信号参数,到上层信号格显示的流程大致是:

Asu与信号强度的对应关系由modem L4决定,此部分的代码建议不要做任何的修改。

 

[信号强度AT命令格式说明]

Modem上报信号强度的格式:

3G modem:

+ECSQ: <asu>, <ber>, <rssi> (2G网络)

+ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no> (3G网络)

4G modem:

+ECSQ: <asu>, <ber>, <rssi>, <rscp>,1,1,1,<act> (2G网络)

+ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>,1,1, <act> (3G网络)

+ECSQ: <rsrq>, <rsrp>,1,1,1,<rsrq_qdbm >,<rsrp_qdbm> <act> (4G网络)

 

L版本、以及以后版本

NetworkControllerImpl.java (frameworks\base\packages\systemui\src\com\android\systemui\statusbar\policy)的updateTelephonySignalStrength()函数会根据获取到的信号强度来设置状态栏信号格的图标。里面会执行mLastSignalLevel = iconLevel = mSignalStrength[slotId].getLevel(); 语句。

这个 getLevel() 函数定义在SignalStrength.java (frameworks\base\telephony\java\android\telephony)中,用于划分信号格区间。在这个函数里面:
(1)LTE会执行 getLteLevel() 函数; getLteLevel()函数会执行 rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);语句,并返回 rsrpIconLevel 的值,作为信号格图标的level,即1格、2格之类。
(2)2G、3G会执行getGsmLevel()函数; getGsmLevel()函数会执行 level = ssExt.mapGsmSignalLevel(asu, mGsmRscpQdbm); 语句,并返回 level 的值,作为信号格图标的level。

上面的 ssExt 对象涉及到当前项目配置的是OM版本、OP01版本等。 不同版本的实现有所不同。
请根据实际项目配置的版本,查看对应的代码文件。

CMCC版本的代码文件是:/vendor/mediatek/proprietary/operator/OP01/frameworks/packages/FwkPlugin/src/com/mediatek/op/telephony/ServiceStateExtOP01.java
CU版本的代码文件是:/vendor/mediatek/proprietary/operator/OP02/frameworks/packages/FwkPlugin/src/com/mediatek/op/telephony/ServiceStateExtOP02.java
Open market版本的代码文件是: /vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/DefaultServiceStateExt.java

 

JB/JB2/JB3/JB5/KK1MP1

1 信号的物理参数会通过AT+ECSQ上报给AP端,格式为:

AT< +ECSQ: <asu>, <ber>, <rssi>    (2G网络)

AT< +ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>     3G网络)

其中<rssi>, <rscp>, <ec/no>这几个物理参数上报时单位为qdbm,换算为dbm的公式为:dbm=qdbm/4

 

2SignalStrength.java中使用IServiceStateExt作为不同运营商客制化的接口。

Ø  对于普通版本:IServiceStateExt的实现为ServiceStateExt.java

Ø  对于中国移动(OP01)版本:IServiceStateExt的实现为ServiceStateExtOP01.java

步骤1:请修改ServiceStateExtXXX.java中的mapGsmSignalDbm(int GsmRscpQdbm,int asu)接口为以下形式,以方便我们接下来的客制化

    public int mapGsmSignalDbm(int GsmRscpQdbm,int asu){

        int dBm;

 //mtk add (这部分在KK版本中已经包含)

        if(mGsmRscpQdbm < 0 && mGsmRscpQdbm ! = -1)

            dBm = GsmRscpQdbm / 4; // Return raw value for 3G network.

        else

//mtk add end

            dBm = -113 + (2 * asu);   

        return dBm;

    }

 

   KK1MP3--4G(mtk 对4G部分只使用到了Rsrp的部分来计算信号强度)

 

mapLteSignalLevel(int mLteRsrp, int mLteRssnr, int mLteSignalStrength){

    ......

    if(mLteRsrp > -44) rsrpIconLevel = -1;

    else if(mLteRsrp >= -85) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_GREAT;

    else if(mLteRsrp >= -95) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_GOOD;

    else if(mLteRsrp >= -105) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_MODERATE;

    else if(mLteRsrp >= -115) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_POOR;

    else if(mLteRsrp >= -140) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;

 

    步骤2:SignalStrength.java中修改getGsmLevel()

    public int getGsmLevel() {

        int level;

 

        // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5

        // asu = 0 (-113dB or less) is very weak

        // signal, its better to show 0 bars to the user in such cases.

        // asu = 99 is a special case, where the signal strength is unknown.

        int asu = getGsmSignalStrength();

        int dBm = getGsmDbm();   //mtk add

        boolean is3G = (mGsmRscpQdbm < 0 && mGsmRscpQdbm ! = -1) ? true : false;    //mtk add (这部分在KK版本中已经包含)

 

        try{
//mtk add (这部分在KK版本中已经包含)

            //level = mServiceStateExt.mapGsmSignalLevel(asu);

            level = mServiceStateExt.mapGsmSignalLevel(is3G, dBm, asu);

//mtk add end

        } catch (Exception e){

            if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;

            else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;

            else if (asu >= 8)  level = SIGNAL_STRENGTH_GOOD;

            else if (asu >= 5)  level = SIGNAL_STRENGTH_MODERATE;

            else level = SIGNAL_STRENGTH_POOR;

        }

        if (DBG) log("getGsmLevel=" + level);

        return level;

    }

 

步骤3:ServiceStateExtXXX.java中添加mapGsmSignalLevel (boolean is3G, int dBm,int asu),做信号格mapping

a.区分3G网络与2G网络

可以通过判断函数参数is3G是否是3G网络,若是3G网络的话为true,反之则是2G网络。

b.使用asuicon level来匹配

利用传入的asu参数,根据自己信号格标准修改代码

c.使用dbmicon level来匹配

利用传入的dBm参数,根据自己信号格标准修改代码

    Example:使用asu作为参数计算WCDMA/GSM信号

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧时旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值