1 /*
2 * Copyright (C) 2021-2024 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 #include "telephony_ext_wrapper.h"
22
23 namespace OHOS {
24 namespace Telephony {
Reset()25 void SignalInfo::Reset()
26 {
27 std::lock_guard<std::mutex> lock(mutex_);
28 cache_.Init();
29 cur_.Init();
30 }
31
InitSignalBar(const int32_t bar) const32 void SignalInfo::InitSignalBar(const int32_t bar) const
33 {
34 SignalInformation::InitSignalBar(bar);
35 }
36
ProcessGsm(const GsmRssi & gsmSignal)37 bool SignalInfo::ProcessGsm(const GsmRssi &gsmSignal)
38 {
39 std::lock_guard<std::mutex> lock(mutex_);
40 cur_.gsm.SetValue(gsmSignal.rxlev, gsmSignal.ber);
41 bool ret = (cur_.gsm == cache_.gsm);
42 cache_.gsm = cur_.gsm;
43 return ret;
44 }
45
ProcessCdma(const CdmaRssi & cdmaSignal)46 bool SignalInfo::ProcessCdma(const CdmaRssi &cdmaSignal)
47 {
48 std::lock_guard<std::mutex> lock(mutex_);
49 cur_.cdma.SetValue(cdmaSignal.absoluteRssi, cdmaSignal.ecno);
50 bool ret = (cur_.cdma == cache_.cdma);
51 cache_.cdma = cur_.cdma;
52 return ret;
53 }
54
ProcessLte(const LteRssi & lteSignal)55 bool SignalInfo::ProcessLte(const LteRssi <eSignal)
56 {
57 std::lock_guard<std::mutex> lock(mutex_);
58 cur_.lte.SetValue(lteSignal.rxlev, lteSignal.rsrp, lteSignal.rsrq, lteSignal.snr);
59 bool ret = (cur_.lte == cache_.lte);
60 cache_.lte = cur_.lte;
61 return ret;
62 }
63
ProcessWcdma(const WCdmaRssi & wcdmaSignal)64 bool SignalInfo::ProcessWcdma(const WCdmaRssi &wcdmaSignal)
65 {
66 std::lock_guard<std::mutex> lock(mutex_);
67 cur_.wcdma.SetValue(wcdmaSignal.rxlev, wcdmaSignal.rscp, wcdmaSignal.ecio, wcdmaSignal.ber);
68 bool ret = (cur_.wcdma == cache_.wcdma);
69 cache_.wcdma = cur_.wcdma;
70 return ret;
71 }
72
ProcessTdScdma(const TdScdmaRssi & tdScdmaSignal)73 bool SignalInfo::ProcessTdScdma(const TdScdmaRssi &tdScdmaSignal)
74 {
75 std::lock_guard<std::mutex> lock(mutex_);
76 cur_.tdScdma.SetValue(tdScdmaSignal.rscp);
77 bool ret = (cur_.tdScdma == cache_.tdScdma);
78 cache_.tdScdma = cur_.tdScdma;
79 return ret;
80 }
81
ProcessNr(const NrRssi & nrSignal)82 bool SignalInfo::ProcessNr(const NrRssi &nrSignal)
83 {
84 std::lock_guard<std::mutex> lock(mutex_);
85 cur_.nr.SetValue(nrSignal.rsrp, nrSignal.rsrq, nrSignal.sinr);
86 bool ret = (cur_.nr == cache_.nr);
87 cache_.nr = cur_.nr;
88 return ret;
89 }
90
PrintfLog(const Rssi & signalIntensity)91 static void PrintfLog(const Rssi &signalIntensity)
92 {
93 TELEPHONY_LOGD("gm.rssi:%{public}d, gm.ber:%{public}d\n", signalIntensity.gw.rxlev, signalIntensity.gw.ber);
94
95 TELEPHONY_LOGD("cdma.absoluteRssi:%{public}d, cdma.ecno:%{public}d ", signalIntensity.cdma.absoluteRssi,
96 signalIntensity.cdma.ecno);
97
98 TELEPHONY_LOGD("lte.rxlev:%{public}d, "
99 "lte.rsrq:%{public}d, lte.rsrp:%{public}d, lte.snr:%{public}d ",
100 signalIntensity.lte.rxlev, signalIntensity.lte.rsrq, signalIntensity.lte.rsrp, signalIntensity.lte.snr);
101
102 TELEPHONY_LOGD("wcdma.rxlev:%{public}d, "
103 "wcdma.ecio:%{public}d "
104 "wcdma.rscp:%{public}d "
105 "wcdma.ber:%{public}d ",
106 signalIntensity.wcdma.rxlev, signalIntensity.wcdma.ecio, signalIntensity.wcdma.rscp, signalIntensity.wcdma.ber);
107
108 TELEPHONY_LOGD("tdScdma.rscp:%{public}d\n", signalIntensity.tdScdma.rscp);
109
110 TELEPHONY_LOGD("nr.rsrp:%{public}d, "
111 "nr.rsrq:%{public}d, nr.sinr:%{public}d ",
112 signalIntensity.nr.rsrp, signalIntensity.nr.rsrq, signalIntensity.nr.sinr);
113 }
114
ProcessSignalIntensity(int32_t slotId,const AppExecFwk::InnerEvent::Pointer & event)115 void SignalInfo::ProcessSignalIntensity(int32_t slotId, const AppExecFwk::InnerEvent::Pointer &event)
116 {
117 TELEPHONY_LOGD("rssi start......\n");
118 if (event == nullptr) {
119 TELEPHONY_LOGE("event is nullptr\n");
120 return;
121 }
122
123 Rssi *signalIntensity = event->GetSharedObject<Rssi>().get();
124 if (signalIntensity == nullptr) {
125 TELEPHONY_LOGE("rssi is nullptr\n");
126 return;
127 }
128 bool isUpdate = true;
129 if (TELEPHONY_EXT_WRAPPER.processSignalInfos_ != nullptr) {
130 isUpdate = TELEPHONY_EXT_WRAPPER.processSignalInfos_(slotId, *signalIntensity);
131 TELEPHONY_LOGD("TELEPHONY_EXT_WRAPPER.isUpdateSignal : %{public}d", isUpdate);
132 }
133 if (!isUpdate) {
134 return;
135 }
136
137 ProcessSignalIntensity(slotId, signalIntensity);
138 }
139
ProcessSignalIntensity(int32_t slotId,const Rssi * signalIntensity)140 void SignalInfo::ProcessSignalIntensity(int32_t slotId, const Rssi *signalIntensity)
141 {
142 bool gsmUpdate = ProcessGsm(signalIntensity->gw);
143 bool cdmaUpdate = ProcessCdma(signalIntensity->cdma);
144 bool lteUpdate = ProcessLte(signalIntensity->lte);
145 bool wcdmaUpdate = ProcessWcdma(signalIntensity->wcdma);
146 bool tdScdmaUpdate = ProcessTdScdma(signalIntensity->tdScdma);
147 bool nrUpdate = ProcessNr(signalIntensity->nr);
148 if (!gsmUpdate || !cdmaUpdate || !lteUpdate || !wcdmaUpdate || !tdScdmaUpdate || !nrUpdate) {
149 std::vector<sptr<SignalInformation>> signals;
150 GetSignalInfoList(signals);
151 if (TELEPHONY_EXT_WRAPPER.sortSignalInfoListExt_ != nullptr) {
152 TELEPHONY_EXT_WRAPPER.sortSignalInfoListExt_(slotId, signals);
153 }
154 DelayedSingleton<NetworkSearchNotify>::GetInstance()->NotifySignalInfoUpdated(slotId, signals);
155 int level = 0;
156 if (signals.size() != 0) {
157 if (signals[0] == nullptr) {
158 TELEPHONY_LOGE("signals is nullptr!");
159 return;
160 }
161 level = signals[0]->GetSignalLevel();
162 }
163 CoreServiceHiSysEvent::WriteSignalLevelBehaviorEvent(slotId, level);
164 }
165 PrintfLog(*signalIntensity);
166 }
167
GetSignalInfoList(std::vector<sptr<SignalInformation>> & signals)168 void SignalInfo::GetSignalInfoList(std::vector<sptr<SignalInformation>> &signals)
169 {
170 std::lock_guard<std::mutex> lock(mutex_);
171 bool gsmValid = cur_.gsm.ValidateGsmValue();
172 bool cdmaValid = cur_.cdma.ValidateCdmaValue();
173 bool lteValid = cur_.lte.ValidateLteValue();
174 bool wcdmaValid = cur_.wcdma.ValidateWcdmaValue();
175 bool tdScdmaValid = cur_.tdScdma.ValidateTdScdmaValue();
176 bool nrValid = cur_.nr.ValidateNrValue();
177
178 if (lteValid) {
179 signals.emplace_back(cur_.lte.NewInstance());
180 }
181 if (nrValid) {
182 signals.emplace_back(cur_.nr.NewInstance());
183 }
184 if (cdmaValid) {
185 signals.emplace_back(cur_.cdma.NewInstance());
186 }
187 if (tdScdmaValid) {
188 signals.emplace_back(cur_.tdScdma.NewInstance());
189 }
190 if (wcdmaValid) {
191 signals.emplace_back(cur_.wcdma.NewInstance());
192 }
193 if (gsmValid) {
194 signals.emplace_back(cur_.gsm.NewInstance());
195 }
196 }
197 } // namespace Telephony
198 } // namespace OHOS
199