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 &lteSignal)
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