• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "signal_info.h"
17 
18 #include "core_service_hisysevent.h"
19 #include "network_search_notify.h"
20 #include "telephony_log_wrapper.h"
21 
22 namespace OHOS {
23 namespace Telephony {
Reset()24 void SignalInfo::Reset()
25 {
26     std::lock_guard<std::mutex> lock(mutex_);
27     cache_.Init();
28     cur_.Init();
29 }
30 
InitSignalBar(const int32_t bar) const31 void SignalInfo::InitSignalBar(const int32_t bar) const
32 {
33     SignalInformation::InitSignalBar(bar);
34 }
35 
ProcessGsm(const GsmRssi & gsmSignal)36 bool SignalInfo::ProcessGsm(const GsmRssi &gsmSignal)
37 {
38     std::lock_guard<std::mutex> lock(mutex_);
39     cur_.gsm.SetValue(gsmSignal.rxlev, gsmSignal.ber);
40     bool ret = (cur_.gsm == cache_.gsm);
41     cache_.gsm = cur_.gsm;
42     return ret;
43 }
44 
ProcessCdma(const CdmaRssi & cdmaSignal)45 bool SignalInfo::ProcessCdma(const CdmaRssi &cdmaSignal)
46 {
47     std::lock_guard<std::mutex> lock(mutex_);
48     cur_.cdma.SetValue(cdmaSignal.absoluteRssi, cdmaSignal.ecno);
49     bool ret = (cur_.cdma == cache_.cdma);
50     cache_.cdma = cur_.cdma;
51     return ret;
52 }
53 
ProcessLte(const LteRssi & lteSignal)54 bool SignalInfo::ProcessLte(const LteRssi &lteSignal)
55 {
56     std::lock_guard<std::mutex> lock(mutex_);
57     cur_.lte.SetValue(lteSignal.rxlev, lteSignal.rsrp, lteSignal.rsrq, lteSignal.snr);
58     bool ret = (cur_.lte == cache_.lte);
59     cache_.lte = cur_.lte;
60     return ret;
61 }
62 
ProcessWcdma(const WCdmaRssi & wcdmaSignal)63 bool SignalInfo::ProcessWcdma(const WCdmaRssi &wcdmaSignal)
64 {
65     std::lock_guard<std::mutex> lock(mutex_);
66     cur_.wcdma.SetValue(wcdmaSignal.rxlev, wcdmaSignal.rscp, wcdmaSignal.ecio, wcdmaSignal.ber);
67     bool ret = (cur_.wcdma == cache_.wcdma);
68     cache_.wcdma = cur_.wcdma;
69     return ret;
70 }
71 
ProcessTdScdma(const TdScdmaRssi & tdScdmaSignal)72 bool SignalInfo::ProcessTdScdma(const TdScdmaRssi &tdScdmaSignal)
73 {
74     std::lock_guard<std::mutex> lock(mutex_);
75     cur_.tdScdma.SetValue(tdScdmaSignal.rscp);
76     bool ret = (cur_.tdScdma == cache_.tdScdma);
77     cache_.tdScdma = cur_.tdScdma;
78     return ret;
79 }
80 
ProcessNr(const NrRssi & nrSignal)81 bool SignalInfo::ProcessNr(const NrRssi &nrSignal)
82 {
83     std::lock_guard<std::mutex> lock(mutex_);
84     cur_.nr.SetValue(nrSignal.rsrp, nrSignal.rsrq, nrSignal.sinr);
85     bool ret = (cur_.nr == cache_.nr);
86     cache_.nr = cur_.nr;
87     return ret;
88 }
89 
PrintfLog(const Rssi & signalIntensity)90 static void PrintfLog(const Rssi &signalIntensity)
91 {
92     TELEPHONY_LOGD("gm.rssi:%{public}d, gm.ber:%{public}d\n", signalIntensity.gw.rxlev, signalIntensity.gw.ber);
93 
94     TELEPHONY_LOGD("cdma.absoluteRssi:%{public}d, cdma.ecno:%{public}d ", signalIntensity.cdma.absoluteRssi,
95         signalIntensity.cdma.ecno);
96 
97     TELEPHONY_LOGD("lte.rxlev:%{public}d, "
98                    "lte.rsrq:%{public}d, lte.rsrp:%{public}d, lte.snr:%{public}d ",
99         signalIntensity.lte.rxlev, signalIntensity.lte.rsrq, signalIntensity.lte.rsrp, signalIntensity.lte.snr);
100 
101     TELEPHONY_LOGD("wcdma.rxlev:%{public}d, "
102                    "wcdma.ecio:%{public}d "
103                    "wcdma.rscp:%{public}d "
104                    "wcdma.ber:%{public}d ",
105         signalIntensity.wcdma.rxlev, signalIntensity.wcdma.ecio, signalIntensity.wcdma.rscp, signalIntensity.wcdma.ber);
106 
107     TELEPHONY_LOGD("tdScdma.rscp:%{public}d\n", signalIntensity.tdScdma.rscp);
108 
109     TELEPHONY_LOGD("nr.rsrp:%{public}d, "
110                    "nr.rsrq:%{public}d, nr.sinr:%{public}d ",
111         signalIntensity.nr.rsrp, signalIntensity.nr.rsrq, signalIntensity.nr.sinr);
112 }
113 
ProcessSignalIntensity(int32_t slotId,const AppExecFwk::InnerEvent::Pointer & event)114 void SignalInfo::ProcessSignalIntensity(int32_t slotId, const AppExecFwk::InnerEvent::Pointer &event)
115 {
116     TELEPHONY_LOGD("rssi start......\n");
117     if (event == nullptr) {
118         TELEPHONY_LOGE("event is nullptr\n");
119         return;
120     }
121 
122     Rssi *signalIntensity = event->GetSharedObject<Rssi>().get();
123     if (signalIntensity == nullptr) {
124         TELEPHONY_LOGE("rssi is nullptr\n");
125         return;
126     }
127     bool gsmUpdate = ProcessGsm(signalIntensity->gw);
128     bool cdmaUpdate = ProcessCdma(signalIntensity->cdma);
129     bool lteUpdate = ProcessLte(signalIntensity->lte);
130     bool wcdmaUpdate = ProcessWcdma(signalIntensity->wcdma);
131     bool tdScdmaUpdate = ProcessTdScdma(signalIntensity->tdScdma);
132     bool nrUpdate = ProcessNr(signalIntensity->nr);
133     if (!gsmUpdate || !cdmaUpdate || !lteUpdate || !wcdmaUpdate || !tdScdmaUpdate || !nrUpdate) {
134         std::vector<sptr<SignalInformation>> signals;
135         GetSignalInfoList(signals);
136         DelayedSingleton<NetworkSearchNotify>::GetInstance()->NotifySignalInfoUpdated(slotId, signals);
137         int level = 0;
138         if (signals.size() != 0) {
139             level = signals[0]->GetSignalLevel();
140         }
141         CoreServiceHiSysEvent::WriteSignalLevelBehaviorEvent(slotId, level);
142     }
143     PrintfLog(*signalIntensity);
144 }
145 
GetSignalInfoList(std::vector<sptr<SignalInformation>> & signals)146 void SignalInfo::GetSignalInfoList(std::vector<sptr<SignalInformation>> &signals)
147 {
148     std::lock_guard<std::mutex> lock(mutex_);
149     bool gsmValid = cur_.gsm.ValidateGsmValue();
150     bool cdmaValid = cur_.cdma.ValidateCdmaValue();
151     bool lteValid = cur_.lte.ValidateLteValue();
152     bool wcdmaValid = cur_.wcdma.ValidateWcdmaValue();
153     bool tdScdmaValid = cur_.tdScdma.ValidateTdScdmaValue();
154     bool nrValid = cur_.nr.ValidateNrValue();
155 
156     if (lteValid) {
157         signals.emplace_back(cur_.lte.NewInstance());
158     }
159     if (nrValid) {
160         signals.emplace_back(cur_.nr.NewInstance());
161     }
162     if (cdmaValid) {
163         signals.emplace_back(cur_.cdma.NewInstance());
164     }
165     if (tdScdmaValid) {
166         signals.emplace_back(cur_.tdScdma.NewInstance());
167     }
168     if (wcdmaValid) {
169         signals.emplace_back(cur_.wcdma.NewInstance());
170     }
171     if (gsmValid) {
172         signals.emplace_back(cur_.gsm.NewInstance());
173     }
174 }
175 } // namespace Telephony
176 } // namespace OHOS
177