signal display process

本文深入解析了GSM数据连接跟踪器的工作原理,包括其构造方法、事件处理流程及与GPRS状态的交互机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在GsmDataConnectiontracker构造方法中
     p.mSST.registerForGprsAttached(this, EVENT_GPRS_ATTACHED, null);
        p.mSST.registerForGprsDetached(this, EVENT_GPRS_DETACHED, null);
mSST是GsmServiceStateTrack。
    void registerForGprsDetached(Handler h, int what, Object obj) {
        Registrant r = new Registrant(h, what, obj);
        gprsDetachedRegistrants.add(r);

        if (gprsState == ServiceState.STATE_OUT_OF_SERVICE) {
            r.notifyRegistrant();
        }
        }
在mGsmServiceStateTrack中,当收到底层上来的PS注册状态时,执行:
    case EVENT_POLL_STATE_GPRS:
                    states = (String[])ar.result;

                    int type = 0;
                    regState = -1;
                    if (states.length > 0) {
                        try {
                            regState = Integer.parseInt(states[0]);

                            // states[3] (if present) is the current radio technology
                            if (states.length >= 4 && states[3] != null) {
                                type = Integer.parseInt(states[3]);
                            }
                        } catch (NumberFormatException ex) {
                            Log.w(LOG_TAG, "error parsing GprsRegistrationState: " + ex);
                        }
                    }
                    newGPRSState = regCodeToServiceState(regState);
                    mDataRoaming = regCodeIsRoaming(regState);
                    newNetworkType = type;
                    newSS.setRadioTechnology(type);
                break;
然后调用pollStateDone(),方法中:
     if (hasGprsAttached) {
            gprsAttachedRegistrants.notifyRegistrants();
        }

        if (hasGprsDetached) {
            gprsDetachedRegistrants.notifyRegistrants();
        }
然后调用在GsmDataConnectiontracker的方法:
     public void handleMessage (Message msg) {
        if (DBG) Log.d(LOG_TAG,"GSMDataConnTrack handleMessage "+msg);

        if (!mGsmPhone.mIsTheCurrentActivePhone) {
            Log.d(LOG_TAG, "Ignore GSM msgs since GSM phone is inactive");
            return;
        }

        switch (msg.what) {
            case EVENT_RECORDS_LOADED:
                onRecordsLoaded();
                break;

            case EVENT_GPRS_DETACHED:
                onGprsDetached();
                break;

            case EVENT_GPRS_ATTACHED:
                onGprsAttached();
                break;
        }
        private void onGprsAttached() {
        if (state == State.CONNECTED) {
            startNetStatPoll();
            phone.notifyDataConnection(Phone.REASON_GPRS_ATTACHED);
        } else {
            if (state == State.FAILED) {
                cleanUpConnection(false, Phone.REASON_GPRS_ATTACHED);
                mRetryMgr.resetRetryCount();
            }
            trySetupData(Phone.REASON_GPRS_ATTACHED);
        }
        }

        protected void startNetStatPoll() {
        if (state == State.CONNECTED && mPingTestActive == false && netStatPollEnabled == false) {
            Log.d(LOG_TAG, "[DataConnection] Start poll NetStat");
            resetPollStats();
            netStatPollEnabled = true;
            mPollNetStat.run();
        }
        }
    private Runnable mPollNetStat = new Runnable()
        {

        public void run() {
            long sent, received;
            long preTxPkts = -1, preRxPkts = -1;

            Activity newActivity;

            preTxPkts = txPkts;
            preRxPkts = rxPkts;

            txPkts = TrafficStats.getMobileTxPackets();
            rxPkts = TrafficStats.getMobileRxPackets();setupData

            //Log.d(LOG_TAG, "rx " + String.valueOf(rxPkts) + " tx " + String.valueOf(txPkts));

            if (netStatPollEnabled && (preTxPkts > 0 || preRxPkts > 0)) {
                sent = txPkts - preTxPkts;
                received = rxPkts - preRxPkts;

                if ( sent > 0 && received > 0 ) {
                    sentSinceLastRecv = 0;
                    newActivity = Activity.DATAINANDOUT;
                    mPdpResetCount = 0;
                } else if (sent > 0 && received == 0) {
                    if (phone.getState() == Phone.State.IDLE) {
                        sentSinceLastRecv += sent;
                    } else {
                        sentSinceLastRecv = 0;
                    }
                    newActivity = Activity.DATAOUT;
                } else if (sent == 0 && received > 0) {
                    sentSinceLastRecv = 0;
                    newActivity = Activity.DATAIN;
                    mPdpResetCount = 0;
                } else if (sent == 0 && received == 0) {
                    newActivity = Activity.NONE;
                } else {
                    sentSinceLastRecv = 0;
                    newActivity = Activity.NONE;
                }

                if (activity != newActivity && mIsScreenOn) {
                    activity = newActivity;
                    phone.notifyDataActivity();
                }
            }
PhoneBase中:
        public void notifyDataActivity() {
        mNotifier.notifyDataActivity(this);
        }
        public void notifyDataActivity() {
        mNotifier.notifyDataActivity(this);
        }
DefaultPhoneNotifier:
        public void notifyDataActivity(Phone sender) {
        try {
            mRegistry.notifyDataActivity(convertDataActivityState(sender.getDataActivityState()));
        } catch (RemoteException ex) {
            // system process is dead
        }
        }
GsmPhone:
    public DataActivityState getDataActivityState() {
        DataActivityState ret = DataActivityState.NONE;

        if (mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE) {
            switch (mDataConnection.getActivity()) {
                case DATAIN:
                    ret = DataActivityState.DATAIN;
                break;

                case DATAOUT:
                    ret = DataActivityState.DATAOUT;
                break;

                case DATAINANDOUT:
                    ret = DataActivityState.DATAINANDOUT;
                break;
            }
        }

        return ret;
        }
调用DefaultPhoneNotifier:
        public static int convertDataActivityState(Phone.DataActivityState state) {
        switch (state) {
            case DATAIN:
                return TelephonyManager.DATA_ACTIVITY_IN;
            case DATAOUT:
                return TelephonyManager.DATA_ACTIVITY_OUT;
            case DATAINANDOUT:
                return TelephonyManager.DATA_ACTIVITY_INOUT;
            case DORMANT:
                return TelephonyManager.DATA_ACTIVITY_DORMANT;
            default:
                return TelephonyManager.DATA_ACTIVITY_NONE;
        }
        }
调用TelephonyRegister:
     public void notifyDataActivity(int state) {
        369         if (!checkNotifyPermission("notifyDataActivity()" )) {
        370             return;
        371         }
        372         synchronized (mRecords) {
        373             mDataActivity = state;
        374             for (int i = mRecords.size() - 1; i >= 0; i--) {
        375                 Record r = mRecords.get(i);
        376                 if ((r.events & PhoneStateListener.LISTEN_DATA_ACTIVITY) != 0) {
        377                     try {
        378                         r.callback.onDataActivity(state);
        379                     } catch (RemoteException ex) {
        380                         remove(r.binder);
        381                     }
        382                 }
        383             }
        384         }
        385     }

StatusBarPolicy中:
     private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
        @Override
        public void onDataActivity(int direction) {
            mDataActivity = direction;
            updateDataIcon();
        }
        };
    private final void updateDataIcon() {
        int iconId;
        boolean visible = true;

        if (!isCdma()) {
            // GSM case, we have to check also the sim state
            if (mSimState == IccCard.State.READY || mSimState == IccCard.State.UNKNOWN) {
                if (hasPsService() && mDataState == TelephonyManager.DATA_CONNECTED) {
                    switch (mDataActivity) {
                        case TelephonyManager.DATA_ACTIVITY_IN:
                            iconId = mDataIconList[1];
                            break;
                        case TelephonyManager.DATA_ACTIVITY_OUT:
                            iconId = mDataIconList[2];
                            break;
                        case TelephonyManager.DATA_ACTIVITY_INOUT:
                            iconId = mDataIconList[3];
                            break;
                        default:
                            iconId = mDataIconList[0];
                            break;
                    }
                    mService.setIcon("data_connection", iconId, 0);
                } else {
                    visible = false;
                }
            } else {
                iconId = R.drawable.stat_sys_no_sim;
                mService.setIcon("data_connection", iconId, 0);
            }
        }
        }


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Display is Port ( CLK : in STD_LOGIC; CURRENT_FLOOR: in STD_LOGIC_VECTOR(2 downto 0); MODE : in STD_LOGIC_VECTOR(1 downto 0); EMERGENCY_FLAG: in STD_LOGIC; LOCK_TIMER : in STD_LOGIC_VECTOR(5 downto 0); SEG_DATA : out STD_LOGIC_VECTOR(7 downto 0); SEG_SELECT : out STD_LOGIC_VECTOR(7 downto 0) ); end Display; architecture Behavioral of Display is signal DISPLAY_VALUE : STD_LOGIC_VECTOR(7 downto 0); signal seg_index : STD_LOGIC_VECTOR(2 downto 0) := "000"; begin process(CURRENT_FLOOR, MODE, EMERGENCY_FLAG, LOCK_TIMER) begin if EMERGENCY_FLAG = '1' then DISPLAY_VALUE <= "1110" & LOCK_TIMER(5 downto 2); -- 显示倒计时 else case MODE is when "01" => DISPLAY_VALUE <= "0001" & CURRENT_FLOOR; -- 普通模式 when "10" => DISPLAY_VALUE <= "0010" & CURRENT_FLOOR; -- 管理员模式 when "11" => DISPLAY_VALUE <= "0011" & CURRENT_FLOOR; -- 访客模式 when others => DISPLAY_VALUE <= "0001" & CURRENT_FLOOR; end case; end if; end process; process(CLK) begin if rising_edge(CLK) then case seg_index is when "000" => SEG_SELECT <= "11111110"; case DISPLAY_VALUE(3 downto 0) is when "0000" => SEG_DATA <= "11000000"; -- 0 when "0001" => SEG_DATA <= "11111001"; -- 1 when "0010" => SEG_DATA <= "10100100"; -- 2 when "0011" => SEG_DATA <= "10110000"; -- 3 when "0100" => SEG_DATA <= "10011001"; -- 4 when "0101" => SEG_DATA <= "10010010"; -- 5 when "0110" => SEG_DATA <= "10000010"; -- 6 when "0111" => SEG_DATA <= "11111000"; -- 7 when "1000" => SEG_DATA <= "10000000"; -- 8 when "1001" => SEG_DATA <= "10010000"; -- 9 when "1010" => SEG_DATA <= "10001000"; -- A when "1011" => SEG_DATA <= "10000011"; -- b when "1100" => SEG_DATA <= "11000110"; -- C when "1101" => SEG_DATA <= "10100001"; -- d when "1110" => SEG_DATA <= "10000110"; -- E when others => SEG_DATA <= "10001110"; -- F end case; when others => SEG_SELECT <= "11111111"; end case; seg_index <= seg_index + 1; end if; end process; end Behavioral;Error (10344): VHDL expression error at DISPLAY.vhd(28): expression has 7 elements, but must have 8 elements
最新发布
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值