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 <eSignal)
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