1 /*
2  * Copyright (c) 2023 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 "sensor_if_service.h"
17 #include <refbase.h>
18 #include <cinttypes>
19 #include "sensor_uhdf_log.h"
20 #include "sensor_type.h"
21 #include "sensor_callback_vdi.h"
22 #include "callback_death_recipient.h"
23 #include "sensor_hdi_dump.h"
24 #include "devhost_dump_reg.h"
25 
26 constexpr int DISABLE_SENSOR = 0;
27 constexpr int REPORT_INTERVAL = 0;
28 constexpr int UNREGISTER_SENSOR = 0;
29 constexpr int REGISTER_SENSOR = 1;
30 constexpr int ENABLE_SENSOR = 1;
31 constexpr int COMMON_REPORT_FREQUENCY = 1000000000;
32 constexpr int COPY_SENSORINFO = 1;
33 
34 enum BatchSeniorMode {
35         SA = 0,
36         SDC = 1
37 };
38 
39 #define HDF_LOG_TAG uhdf_sensor_service
40 
41 namespace OHOS {
42 namespace HDI {
43 namespace Sensor {
44 namespace V2_0 {
45 namespace {
46     constexpr int32_t CALLBACK_CTOUNT_THRESHOLD = 1;
47     using CallBackDeathRecipientMap = std::unordered_map<IRemoteObject *, sptr<CallBackDeathRecipient>>;
48     CallBackDeathRecipientMap g_callBackDeathRecipientMap;
49 }
50 
SensorIfService()51 SensorIfService::SensorIfService()
52 {
53     int32_t ret = GetSensorVdiImpl();
54     if (ret != HDF_SUCCESS) {
55         HDF_LOGE("%{public}s: get sensor vdi instance failed", __func__);
56     }
57 }
58 
~SensorIfService()59 SensorIfService::~SensorIfService()
60 {
61     if (vdi_ != nullptr) {
62         HdfCloseVdi(vdi_);
63     }
64     RemoveDeathNotice(TRADITIONAL_SENSOR_TYPE);
65     RemoveDeathNotice(MEDICAL_SENSOR_TYPE);
66 }
67 
RegisteDumpHost()68 void SensorIfService::RegisteDumpHost()
69 {
70     int32_t ret = DevHostRegisterDumpHost(GetSensorDump);
71     if (ret != HDF_SUCCESS) {
72         HDF_LOGE("%{public}s: DevHostRegisterDumpHost error", __func__);
73     }
74     return;
75 }
76 
GetSensorVdiImpl()77 int32_t SensorIfService::GetSensorVdiImpl()
78 {
79     struct OHOS::HDI::Sensor::V1_1::WrapperSensorVdi *wrapperSensorVdi = nullptr;
80     uint32_t version = 0;
81     vdi_ = HdfLoadVdi(HDI_SENSOR_VDI_LIBNAME);
82     if (vdi_ == nullptr || vdi_->vdiBase == nullptr) {
83         HDF_LOGE("%{public}s: load sensor vdi failed", __func__);
84         return HDF_FAILURE;
85     }
86 
87     version = HdfGetVdiVersion(vdi_);
88     if (version != 1) {
89         HDF_LOGE("%{public}s: get sensor vdi version failed", __func__);
90         return HDF_FAILURE;
91     }
92 
93     wrapperSensorVdi = reinterpret_cast<struct OHOS::HDI::Sensor::V1_1::WrapperSensorVdi *>(vdi_->vdiBase);
94     sensorVdiImpl_ = wrapperSensorVdi->sensorModule;
95     if (sensorVdiImpl_ == nullptr) {
96         HDF_LOGE("%{public}s: get sensor impl failed", __func__);
97         return HDF_FAILURE;
98     }
99 
100     return HDF_SUCCESS;
101 }
102 
Init()103 int32_t SensorIfService::Init()
104 {
105     if (sensorVdiImpl_ == nullptr) {
106         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
107         return HDF_FAILURE;
108     }
109     int32_t ret = sensorVdiImpl_->Init();
110     if (ret != SENSOR_SUCCESS) {
111         HDF_LOGE("%{public}s Init failed, error code is %{public}d", __func__, ret);
112     } else {
113         ret = GetAllSensorInfo(hdfSensorInformations);
114         if (ret != SENSOR_SUCCESS) {
115             HDF_LOGE("%{public}s GetAllSensorInfo failed, error code is %{public}d", __func__, ret);
116         }
117     }
118 #ifdef SENSOR_DEBUG
119     RegisteDumpHost();
120 #endif
121     return ret;
122 }
123 
GetSensorCb(int32_t groupId,const sptr<ISensorCallback> & callbackObj,bool cbFlag)124 sptr<SensorCallbackVdi> SensorIfService::GetSensorCb(int32_t groupId, const sptr<ISensorCallback> &callbackObj,
125     bool cbFlag)
126 {
127     SENSOR_TRACE_PID;
128     if (groupId == TRADITIONAL_SENSOR_TYPE) {
129         if (cbFlag) {
130             traditionalCb = new SensorCallbackVdi(callbackObj);
131         }
132         return traditionalCb;
133     }
134     if (cbFlag) {
135         medicalCb = new SensorCallbackVdi(callbackObj);
136     }
137     return medicalCb;
138 }
139 
GetAllSensorInfo(std::vector<HdfSensorInformation> & info)140 int32_t SensorIfService::GetAllSensorInfo(std::vector<HdfSensorInformation> &info)
141 {
142     SENSOR_TRACE_PID;
143     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
144     HDF_LOGI("%{public}s: serviceId = %{public}d", __func__, serviceId);
145     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
146     if (sensorVdiImpl_ == nullptr) {
147         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
148         return HDF_FAILURE;
149     }
150 
151     std::vector<OHOS::HDI::Sensor::V1_1::HdfSensorInformationVdi> sensorInfoVdi = {};
152     SENSOR_TRACE_START("sensorVdiImpl_->GetAllSensorInfo");
153     int32_t ret = sensorVdiImpl_->GetAllSensorInfo(sensorInfoVdi);
154     SENSOR_TRACE_FINISH;
155     if (ret != SENSOR_SUCCESS) {
156         HDF_LOGE("%{public}s GetAllSensors failed, error code is %{public}d", __func__, ret);
157         return ret;
158     }
159 
160     if (sensorInfoVdi.empty()) {
161         HDF_LOGE("%{public}s no sensor info in list", __func__);
162         return HDF_FAILURE;
163     }
164 
165     for (const auto &it : sensorInfoVdi) {
166         struct HdfSensorInformation sensorInfo = {};
167         sensorInfo.sensorName = it.sensorName;
168         sensorInfo.vendorName = it.vendorName;
169         sensorInfo.firmwareVersion = it.firmwareVersion;
170         sensorInfo.hardwareVersion = it.hardwareVersion;
171         sensorInfo.sensorTypeId = it.sensorTypeId;
172         sensorInfo.sensorId = it.sensorId;
173         sensorInfo.maxRange = it.maxRange;
174         sensorInfo.accuracy = it.accuracy;
175         sensorInfo.power = it.power;
176         sensorInfo.minDelay = it.minDelay;
177         sensorInfo.maxDelay = it.maxDelay;
178         sensorInfo.fifoMaxEventCount = it.fifoMaxEventCount;
179         info.push_back(std::move(sensorInfo));
180 
181         SensorClientsManager::GetInstance()->CopySensorInfo(info, COPY_SENSORINFO);
182     }
183 
184     return HDF_SUCCESS;
185 }
186 
Enable(int32_t sensorId)187 int32_t SensorIfService::Enable(int32_t sensorId)
188 {
189     SENSOR_TRACE_PID_MSG("sensorId " + std::to_string(sensorId));
190     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
191     HDF_LOGI("%{public}s: sensorId %{public}d, serviceId = %{public}d", __func__, sensorId, serviceId);
192     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
193     if (!SensorClientsManager::GetInstance()->IsUpadateSensorState(sensorId, serviceId, ENABLE_SENSOR)) {
194         return HDF_SUCCESS;
195     }
196 
197     if (sensorVdiImpl_ == nullptr) {
198         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
199         return HDF_FAILURE;
200     }
201 
202     SENSOR_TRACE_START("sensorVdiImpl_->Enable");
203     int32_t ret = sensorVdiImpl_->Enable(sensorId);
204     SENSOR_TRACE_FINISH;
205     if (ret != SENSOR_SUCCESS) {
206         HDF_LOGE("%{public}s failed, error code is %{public}d, sensorId = %{public}d, serviceId = %{public}d", __func__,
207                  ret, sensorId, serviceId);
208     } else {
209         SensorClientsManager::GetInstance()->OpenSensor(sensorId, serviceId);
210     }
211 
212     return ret;
213 }
214 
Disable(int32_t sensorId)215 int32_t SensorIfService::Disable(int32_t sensorId)
216 {
217     SENSOR_TRACE_PID_MSG("sensorId " + std::to_string(sensorId));
218     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
219     HDF_LOGI("%{public}s: sensorId %{public}d, serviceId = %{public}d", __func__, sensorId, serviceId);
220     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
221     return DisableSensor(sensorId, serviceId);
222 }
223 
SetBatch(int32_t sensorId,int64_t samplingInterval,int64_t reportInterval)224 int32_t SensorIfService::SetBatch(int32_t sensorId, int64_t samplingInterval, int64_t reportInterval)
225 {
226     SENSOR_TRACE;
227     HDF_LOGD("%{public}s: sensorId is %{public}d, samplingInterval is [%{public}" PRId64 "], \
228         reportInterval is [%{public}" PRId64 "].", __func__, sensorId, samplingInterval, reportInterval);
229     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
230     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
231 
232     int32_t ret = SetBatchSenior(serviceId, sensorId, SA, samplingInterval, reportInterval);
233     if (ret != SENSOR_SUCCESS) {
234         HDF_LOGE("%{public}s SetBatch failed, error code is %{public}d", __func__, ret);
235     }
236 
237     return ret;
238 }
239 
SetBatchSenior(int32_t serviceId,int32_t sensorId,int32_t mode,int64_t samplingInterval,int64_t reportInterval)240 int32_t SensorIfService::SetBatchSenior(int32_t serviceId, int32_t sensorId, int32_t mode, int64_t samplingInterval,
241                                         int64_t reportInterval)
242 {
243     SENSOR_TRACE_PID_MSG("sensorId " + std::to_string(sensorId) + "mode " +
244         std::to_string(mode) + "samplingInterval " + std::to_string(samplingInterval) + "reportInterval " +
245         std::to_string(reportInterval));
246     HDF_LOGI("%{public}s: serviceId is %{public}d, sensorId is %{public}d, mode is %{public}d, samplingInterval is "
247              "[%{public}" PRId64 "], reportInterval is [%{public}" PRId64 "].", __func__, serviceId, sensorId, mode,
248              samplingInterval, reportInterval);
249     if (sensorVdiImpl_ == nullptr) {
250         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
251         return HDF_FAILURE;
252     }
253     SensorClientsManager::GetInstance()->SetClientSenSorConfig(sensorId, serviceId, samplingInterval, reportInterval);
254 
255     int64_t saSamplingInterval = samplingInterval;
256     int64_t saReportInterval = reportInterval;
257     int64_t sdcSamplingInterval = samplingInterval;
258     int64_t sdcReportInterval = reportInterval;
259 
260     SensorClientsManager::GetInstance()->SetSensorBestConfig(sensorId, saSamplingInterval, saReportInterval);
261     SensorClientsManager::GetInstance()->SetSdcSensorBestConfig(sensorId, sdcSamplingInterval, sdcReportInterval);
262 
263     samplingInterval = saSamplingInterval < sdcSamplingInterval ? saSamplingInterval : sdcSamplingInterval;
264     reportInterval = saReportInterval < sdcReportInterval ? saReportInterval : sdcReportInterval;
265 
266     SENSOR_TRACE_START("sensorVdiImpl_->SetBatch");
267     int32_t ret = sensorVdiImpl_->SetBatch(sensorId, samplingInterval, reportInterval);
268     SENSOR_TRACE_FINISH;
269     if (ret != SENSOR_SUCCESS) {
270         HDF_LOGE("%{public}s SetBatch failed, error code is %{public}d", __func__, ret);
271         return ret;
272     }
273     if (mode == SA) {
274         SetDelay(sensorId, saSamplingInterval, saReportInterval);
275         SensorClientsManager::GetInstance()->UpdateSensorConfig(sensorId, saSamplingInterval, saReportInterval);
276         SensorClientsManager::GetInstance()->UpdateClientPeriodCount(sensorId, saSamplingInterval, saReportInterval);
277     }
278     if (mode == SDC) {
279         SensorClientsManager::GetInstance()->UpdateSdcSensorConfig(sensorId, sdcSamplingInterval, sdcReportInterval);
280     }
281     SensorClientsManager::GetInstance()->GetSensorBestConfig(sensorId, samplingInterval, reportInterval);
282     SENSOR_TRACE_START("sensorVdiImpl_->SetSaBatch");
283     ret = sensorVdiImpl_->SetSaBatch(sensorId, samplingInterval, samplingInterval);
284     SENSOR_TRACE_FINISH;
285     if (ret != SENSOR_SUCCESS) {
286         HDF_LOGE("%{public}s SetSaBatch failed, error code is %{public}d", __func__, ret);
287     }
288 
289     return ret;
290 }
291 
SetDelay(int32_t sensorId,int64_t & samplingInterval,int64_t & reportInterval)292 int32_t SensorIfService::SetDelay(int32_t sensorId, int64_t &samplingInterval, int64_t &reportInterval)
293 {
294     SENSOR_TRACE_PID_MSG("sensorId " + std::to_string(sensorId) + "samplingInterval " +
295                          std::to_string(samplingInterval) + "reportInterval " + std::to_string(reportInterval));
296     HDF_LOGD("%{public}s: sensorId is %{public}d, samplingInterval is [%{public}" PRId64 "], reportInterval is "
297              "[%{public}" PRId64 "].", __func__, sensorId, samplingInterval, reportInterval);
298     for (auto it = hdfSensorInformations.begin(); it != hdfSensorInformations.end(); ++it) {
299         if (it->sensorId == sensorId) {
300             if (samplingInterval < it->minDelay) {
301                 samplingInterval = it->minDelay;
302                 HDF_LOGI("%{public}s samplingInterval has been set minDelay %{public}s", __func__,
303                          std::to_string(samplingInterval).c_str());
304                 return SENSOR_SUCCESS;
305             }
306             if (samplingInterval > it->maxDelay && it->maxDelay != REPORT_INTERVAL) {
307                 samplingInterval = it->maxDelay;
308                 HDF_LOGI("%{public}s samplingInterval has been set maxDelay %{public}s", __func__,
309                          std::to_string(samplingInterval).c_str());
310                 return SENSOR_SUCCESS;
311             }
312         }
313     }
314     HDF_LOGD("%{public}s samplingInterval not change", __func__);
315     return SENSOR_SUCCESS;
316 }
317 
SetMode(int32_t sensorId,int32_t mode)318 int32_t SensorIfService::SetMode(int32_t sensorId, int32_t mode)
319 {
320     SENSOR_TRACE_PID_MSG("sensorId " + std::to_string(sensorId) + "mode " + std::to_string(mode));
321     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
322     HDF_LOGI("%{public}s: sensorId is %{public}d, mode is %{public}d, serviceId = %{public}d", __func__, sensorId, mode,
323              serviceId);
324     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
325     if (sensorVdiImpl_ == nullptr) {
326         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
327         return HDF_FAILURE;
328     }
329 
330     SENSOR_TRACE_START("sensorVdiImpl_->SetMode");
331     int32_t ret = sensorVdiImpl_->SetMode(sensorId, mode);
332     SENSOR_TRACE_FINISH;
333     if (ret != SENSOR_SUCCESS) {
334         HDF_LOGE("%{public}s SetMode failed, error code is %{public}d", __func__, ret);
335     }
336 
337     return ret;
338 }
339 
SetOption(int32_t sensorId,uint32_t option)340 int32_t SensorIfService::SetOption(int32_t sensorId, uint32_t option)
341 {
342     SENSOR_TRACE_PID_MSG("sensorId " + std::to_string(sensorId) + "option " + std::to_string(option));
343     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
344     HDF_LOGI("%{public}s: sensorId is %{public}d, option is %{public}d, serviceId = %{public}d", __func__, sensorId,
345              option, serviceId);
346     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
347     if (sensorVdiImpl_ == nullptr) {
348         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
349         return HDF_FAILURE;
350     }
351 
352     SENSOR_TRACE_START("sensorVdiImpl_->SetOption");
353     int32_t ret = sensorVdiImpl_->SetOption(sensorId, option);
354     SENSOR_TRACE_FINISH;
355     if (ret != SENSOR_SUCCESS) {
356         HDF_LOGE("%{public}s SetOption failed, error code is %{public}d", __func__, ret);
357     }
358 
359     return ret;
360 }
361 
Register(int32_t groupId,const sptr<ISensorCallback> & callbackObj)362 int32_t SensorIfService::Register(int32_t groupId, const sptr<ISensorCallback> &callbackObj)
363 {
364     SENSOR_TRACE_PID;
365     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
366     HDF_LOGI("%{public}s: groupId %{public}d, service %{public}d", __func__, groupId, serviceId);
367     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
368     int32_t ret = HDF_SUCCESS;
369     int32_t result = AddCallbackMap(groupId, callbackObj);
370     if (result !=SENSOR_SUCCESS) {
371         HDF_LOGE("%{public}s: AddCallbackMap failed groupId[%{public}d]", __func__, groupId);
372     }
373     if (SensorClientsManager::GetInstance()->IsClientsEmpty(groupId)) {
374         if (sensorVdiImpl_ == nullptr) {
375             HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
376             return HDF_FAILURE;
377         }
378         sptr<SensorCallbackVdi> sensorCb = GetSensorCb(groupId, callbackObj, REGISTER_SENSOR);
379         if (sensorCb == nullptr) {
380             HDF_LOGE("%{public}s: get sensorcb fail, groupId[%{public}d]", __func__, groupId);
381             return HDF_FAILURE;
382         }
383         SENSOR_TRACE_START("sensorVdiImpl_->Register");
384         ret = sensorVdiImpl_->Register(groupId, sensorCb);
385         SENSOR_TRACE_FINISH;
386         if (ret != SENSOR_SUCCESS) {
387             HDF_LOGE("%{public}s Register failed, error code is %{public}d", __func__, ret);
388             int32_t removeResult = RemoveSensorDeathRecipient(callbackObj);
389             if (removeResult != SENSOR_SUCCESS) {
390                 HDF_LOGE("%{public}s: callback RemoveSensorDeathRecipient fail, groupId[%{public}d]",
391                     __func__, groupId);
392             }
393         } else {
394             SensorClientsManager::GetInstance()->ReportDataCbRegister(groupId, serviceId, callbackObj);
395         }
396     } else {
397         SensorClientsManager::GetInstance()->ReportDataCbRegister(groupId, serviceId, callbackObj);
398     }
399     return ret;
400 }
401 
Unregister(int32_t groupId,const sptr<ISensorCallback> & callbackObj)402 int32_t SensorIfService::Unregister(int32_t groupId, const sptr<ISensorCallback> &callbackObj)
403 {
404     SENSOR_TRACE_PID;
405     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
406     HDF_LOGI("%{public}s: groupId %{public}d, service %{public}d", __func__, groupId, serviceId);
407     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
408     if (groupId < TRADITIONAL_SENSOR_TYPE || groupId >= SENSOR_GROUP_TYPE_MAX) {
409         HDF_LOGE("%{public}s: groupId %{public}d is error", __func__, groupId);
410         return SENSOR_INVALID_PARAM;
411     }
412     int32_t result = RemoveCallbackMap(groupId, serviceId, callbackObj);
413     if (result !=SENSOR_SUCCESS) {
414         HDF_LOGE("%{public}s: RemoveCallbackMap failed groupId[%{public}d]", __func__, groupId);
415     }
416     SensorClientsManager::GetInstance()->ReportDataCbUnRegister(groupId, serviceId, callbackObj);
417     if (!SensorClientsManager::GetInstance()->IsClientsEmpty(groupId)) {
418         HDF_LOGD("%{public}s: clients is not empty, do not unregister", __func__);
419         return HDF_SUCCESS;
420     }
421     if (!SensorClientsManager::GetInstance()->IsNoSensorUsed()) {
422         HDF_LOGD("%{public}s: sensorUsed is not empty, do not unregister", __func__);
423         return HDF_SUCCESS;
424     }
425 
426     if (sensorVdiImpl_ == nullptr) {
427         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
428         return HDF_FAILURE;
429     }
430 
431     sptr<SensorCallbackVdi> sensorCb = GetSensorCb(groupId, callbackObj, UNREGISTER_SENSOR);
432     if (sensorCb == nullptr) {
433         HDF_LOGE("%{public}s: get sensorcb fail, groupId[%{public}d]", __func__, groupId);
434         return HDF_FAILURE;
435     }
436     SENSOR_TRACE_START("sensorVdiImpl_->Unregister");
437     int32_t ret = sensorVdiImpl_->Unregister(groupId, sensorCb);
438     SENSOR_TRACE_FINISH;
439     if (ret != SENSOR_SUCCESS) {
440         HDF_LOGE("%{public}s: Unregister failed, error code is %{public}d", __func__, ret);
441     }
442 
443     return ret;
444 }
445 
AddCallbackMap(int32_t groupId,const sptr<ISensorCallback> & callbackObj)446 int32_t SensorIfService::AddCallbackMap(int32_t groupId, const sptr<ISensorCallback> &callbackObj)
447 {
448     SENSOR_TRACE_PID;
449     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
450     HDF_LOGI("%{public}s: service %{public}d", __func__, serviceId);
451     auto groupCallBackIter = callbackMap.find(groupId);
452     if (groupCallBackIter != callbackMap.end()) {
453         auto callBackIter =
454             find_if(callbackMap[groupId].begin(), callbackMap[groupId].end(),
455             [&callbackObj](const sptr<ISensorCallback> &callbackRegistered) {
456                 const sptr<IRemoteObject> &lhs = OHOS::HDI::hdi_objcast<ISensorCallback>(callbackObj);
457                 const sptr<IRemoteObject> &rhs = OHOS::HDI::hdi_objcast<ISensorCallback>(callbackRegistered);
458                 return lhs == rhs;
459             });
460         if (callBackIter == callbackMap[groupId].end()) {
461             int32_t addResult = AddSensorDeathRecipient(callbackObj);
462             if (addResult != SENSOR_SUCCESS) {
463                 return HDF_FAILURE;
464             }
465             callbackMap[groupId].push_back(callbackObj);
466         }
467     } else {
468         int32_t addResult = AddSensorDeathRecipient(callbackObj);
469         if (addResult != SENSOR_SUCCESS) {
470             return HDF_FAILURE;
471         }
472         std::vector<sptr<ISensorCallback>> remoteVec;
473         remoteVec.push_back(callbackObj);
474         callbackMap[groupId] = remoteVec;
475     }
476     return SENSOR_SUCCESS;
477 }
478 
RemoveCallbackMap(int32_t groupId,int serviceId,const sptr<ISensorCallback> & callbackObj)479 int32_t SensorIfService::RemoveCallbackMap(int32_t groupId, int serviceId, const sptr<ISensorCallback> &callbackObj)
480 {
481     SENSOR_TRACE_PID;
482     HDF_LOGI("%{public}s: service %{public}d", __func__, serviceId);
483     auto groupIdCallBackIter = callbackMap.find(groupId);
484     if (groupIdCallBackIter == callbackMap.end()) {
485         HDF_LOGE("%{public}s: groupId [%{public}d] callbackObj not registered", __func__, groupId);
486         return HDF_FAILURE;
487     }
488     auto callBackIter =
489         find_if(callbackMap[groupId].begin(), callbackMap[groupId].end(),
490         [&callbackObj](const sptr<ISensorCallback> &callbackRegistered) {
491             const sptr<IRemoteObject> &lhs = OHOS::HDI::hdi_objcast<ISensorCallback>(callbackObj);
492             const sptr<IRemoteObject> &rhs = OHOS::HDI::hdi_objcast<ISensorCallback>(callbackRegistered);
493             return lhs == rhs;
494         });
495     if (callBackIter == callbackMap[groupId].end()) {
496         HDF_LOGE("%{public}s: groupId [%{public}d] callbackObj not registered", __func__, groupId);
497         return HDF_FAILURE;
498     }
499     int32_t removeResult = RemoveSensorDeathRecipient(*callBackIter);
500     if (removeResult != SENSOR_SUCCESS) {
501         HDF_LOGE("%{public}s: last callback RemoveSensorDeathRecipient fail, groupId[%{public}d]", __func__, groupId);
502     }
503     if (callbackMap[groupId].size() > CALLBACK_CTOUNT_THRESHOLD) {
504         callbackMap[groupId].erase(callBackIter);
505     } else {
506         callbackMap.erase(groupId);
507     }
508     std::unordered_map<int, std::set<int>> sensorEnabled = SensorClientsManager::GetInstance()->GetSensorUsed();
509     for (auto iter : sensorEnabled) {
510         if (iter.second.find(serviceId) == iter.second.end()) {
511             continue;
512         }
513         if (!SensorClientsManager::GetInstance()->IsUpadateSensorState(iter.first, serviceId, DISABLE_SENSOR)) {
514             continue;
515         }
516         std::unordered_map<int, std::set<int>> sensorUsed = SensorClientsManager::GetInstance()->GetSensorUsed();
517         if (sensorUsed.find(iter.first) == sensorUsed.end()) {
518             SENSOR_TRACE_START("sensorVdiImpl_->Disable");
519             int32_t ret = sensorVdiImpl_->Disable(iter.first);
520             SENSOR_TRACE_FINISH;
521             if (ret != SENSOR_SUCCESS) {
522                 HDF_LOGE("%{public}s Disable failed, error code is %{public}d", __func__, ret);
523             }
524         }
525     }
526     return SENSOR_SUCCESS;
527 }
528 
AddSensorDeathRecipient(const sptr<ISensorCallback> & callbackObj)529 int32_t SensorIfService::AddSensorDeathRecipient(const sptr<ISensorCallback> &callbackObj)
530 {
531     SENSOR_TRACE_PID;
532     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
533     HDF_LOGI("%{public}s: service %{public}d", __func__, serviceId);
534     sptr<CallBackDeathRecipient> callBackDeathRecipient = new CallBackDeathRecipient(this);
535     if (callBackDeathRecipient == nullptr) {
536         HDF_LOGE("%{public}s: new CallBackDeathRecipient fail", __func__);
537         return HDF_FAILURE;
538     }
539     const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<ISensorCallback>(callbackObj);
540     bool result = remote->AddDeathRecipient(callBackDeathRecipient);
541     if (!result) {
542         HDF_LOGE("%{public}s: AddDeathRecipient fail", __func__);
543         return HDF_FAILURE;
544     }
545     g_callBackDeathRecipientMap[remote.GetRefPtr()] = callBackDeathRecipient;
546     return SENSOR_SUCCESS;
547 }
548 
RemoveSensorDeathRecipient(const sptr<ISensorCallback> & callbackObj)549 int32_t SensorIfService::RemoveSensorDeathRecipient(const sptr<ISensorCallback> &callbackObj)
550 {
551     SENSOR_TRACE_PID;
552     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
553     HDF_LOGI("%{public}s: service %{public}d", __func__, serviceId);
554     const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<ISensorCallback>(callbackObj);
555     auto callBackDeathRecipientIter = g_callBackDeathRecipientMap.find(remote.GetRefPtr());
556     if (callBackDeathRecipientIter == g_callBackDeathRecipientMap.end()) {
557         HDF_LOGE("%{public}s: not find recipient", __func__);
558         return HDF_FAILURE;
559     }
560     bool result = remote->RemoveDeathRecipient(callBackDeathRecipientIter->second);
561     g_callBackDeathRecipientMap.erase(callBackDeathRecipientIter);
562     if (!result) {
563         HDF_LOGE("%{public}s: RemoveDeathRecipient fail", __func__);
564         return HDF_FAILURE;
565     }
566     return SENSOR_SUCCESS;
567 }
568 
OnRemoteDied(const wptr<IRemoteObject> & object)569 void SensorIfService::OnRemoteDied(const wptr<IRemoteObject> &object)
570 {
571     SENSOR_TRACE_PID;
572     HDF_LOGI("%{public}s: service %{public}d", __func__, static_cast<uint32_t>(HdfRemoteGetCallingPid()));
573     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
574     sptr<IRemoteObject> callbackObject = object.promote();
575     if (callbackObject == nullptr) {
576         return;
577     }
578 
579     for (int32_t groupId = TRADITIONAL_SENSOR_TYPE; groupId < SENSOR_GROUP_TYPE_MAX; groupId++) {
580         auto groupIdIter = callbackMap.find(groupId);
581         if (groupIdIter == callbackMap.end()) {
582             continue;
583         }
584         auto callBackIter =
585         find_if(callbackMap[groupId].begin(), callbackMap[groupId].end(),
586         [&callbackObject](const sptr<ISensorCallback> &callbackRegistered) {
587             return callbackObject.GetRefPtr() ==
588                 (OHOS::HDI::hdi_objcast<ISensorCallback>(callbackRegistered)).GetRefPtr();
589         });
590         if (callBackIter != callbackMap[groupId].end()) {
591             int32_t serviceId = SensorClientsManager::GetInstance()->GetServiceId(groupId, *callBackIter);
592             if (sensorVdiImpl_ == nullptr) {
593                 HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
594                 continue;
595             }
596             int32_t ret = RemoveCallbackMap(groupId, serviceId, *callBackIter);
597             if (ret != SENSOR_SUCCESS) {
598                 HDF_LOGE("%{public}s: Unregister failed groupId[%{public}d]", __func__, groupId);
599             }
600             if (!SensorClientsManager::GetInstance()->IsClientsEmpty(groupId)) {
601                 HDF_LOGD("%{public}s: clients is not empty, do not unregister", __func__);
602                 continue;
603             }
604             sptr<SensorCallbackVdi> sensorCb = GetSensorCb(groupId, *callBackIter, UNREGISTER_SENSOR);
605             if (sensorCb == nullptr) {
606                 HDF_LOGE("%{public}s: get sensorcb fail, groupId[%{public}d]", __func__, groupId);
607                 continue;
608             }
609             SENSOR_TRACE_START("sensorVdiImpl_->Unregister");
610             ret = sensorVdiImpl_->Unregister(groupId, sensorCb);
611             SENSOR_TRACE_FINISH;
612             if (ret != SENSOR_SUCCESS) {
613                 HDF_LOGE("%{public}s: Unregister failed, error code is %{public}d", __func__, ret);
614             }
615         }
616     }
617 }
618 
RemoveDeathNotice(int32_t sensorType)619 void  SensorIfService::RemoveDeathNotice(int32_t sensorType)
620 {
621     SENSOR_TRACE_PID_MSG("sensorType " + std::to_string(sensorType));
622     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
623     HDF_LOGI("%{public}s: service %{public}d, sensorType %{public}d", __func__, serviceId, sensorType);
624     auto iter = callbackMap.find(sensorType);
625     if (iter != callbackMap.end()) {
626         return;
627     }
628     for (auto callback : callbackMap[sensorType]) {
629         const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<ISensorCallback>(callback);
630         auto recipientIter = g_callBackDeathRecipientMap.find(remote.GetRefPtr());
631         if (recipientIter != g_callBackDeathRecipientMap.end()) {
632             bool removeResult = remote->RemoveDeathRecipient(recipientIter->second);
633             if (!removeResult) {
634                 HDF_LOGE("%{public}s: sensor destroyed, callback RemoveSensorDeathRecipient fail", __func__);
635             }
636         }
637     }
638 }
639 
ReadData(int32_t sensorId,std::vector<HdfSensorEvents> & event)640 int32_t SensorIfService::ReadData(int32_t sensorId, std::vector<HdfSensorEvents> &event)
641 {
642     SENSOR_TRACE_PID_MSG("sensorId " + std::to_string(sensorId));
643     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
644     HDF_LOGI("%{public}s: service %{public}d", __func__, serviceId);
645     if (sensorVdiImpl_ == nullptr) {
646         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
647         return HDF_FAILURE;
648     }
649 
650     return HDF_SUCCESS;
651 }
652 
DisableSensor(int32_t sensorId,uint32_t serviceId)653 int32_t SensorIfService::DisableSensor(int32_t sensorId, uint32_t serviceId)
654 {
655     SENSOR_TRACE_PID_MSG("sensorId " + std::to_string(sensorId));
656     if (!SensorClientsManager::GetInstance()->IsUpadateSensorState(sensorId, serviceId, DISABLE_SENSOR)) {
657         HDF_LOGE("%{public}s There are still some services enable", __func__);
658         return HDF_SUCCESS;
659     }
660 
661     if (sensorVdiImpl_ == nullptr) {
662         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
663         return HDF_FAILURE;
664     }
665 
666     int32_t ret = SENSOR_SUCCESS;
667     if (SensorClientsManager::GetInstance()->IsExistSdcSensorEnable(sensorId)) {
668         SENSOR_TRACE_START("sensorVdiImpl_->SetSaBatch");
669         ret = sensorVdiImpl_->SetSaBatch(sensorId, REPORT_INTERVAL, REPORT_INTERVAL);
670         SENSOR_TRACE_FINISH;
671         if (ret != SENSOR_SUCCESS) {
672             HDF_LOGE("%{public}s SetSaBatch failed, error code is %{public}d, sensorId = %{public}d, serviceId = "
673                      "%{public}d", __func__, ret, sensorId, serviceId);
674             return ret;
675         }
676         return HDF_SUCCESS;
677     }
678 
679     SENSOR_TRACE_START("sensorVdiImpl_->Disable");
680     ret = sensorVdiImpl_->Disable(sensorId);
681     SENSOR_TRACE_FINISH;
682     if (ret != SENSOR_SUCCESS) {
683         HDF_LOGE("%{public}s failed, error code is %{public}d, sensorId = %{public}d, serviceId = %{public}d", __func__,
684                  ret, sensorId, serviceId);
685     }
686 
687     return ret;
688 }
689 
SetSdcSensor(int32_t sensorId,bool enabled,int32_t rateLevel)690 int32_t SensorIfService::SetSdcSensor(int32_t sensorId, bool enabled, int32_t rateLevel)
691 {
692     SENSOR_TRACE_PID_MSG("sensorId " + std::to_string(sensorId) + "enabled " + std::to_string(enabled) + "rateLevel " +
693         std::to_string(rateLevel));
694     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
695     HDF_LOGI("%{public}s: sensorId %{public}d, enabled %{public}u, rateLevel %{public}u, serviceId %{public}d",
696              __func__, sensorId, enabled, rateLevel, serviceId);
697     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
698     if (sensorVdiImpl_ == nullptr) {
699         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
700         return HDF_FAILURE;
701     }
702     int32_t ret = SENSOR_SUCCESS;
703     if (rateLevel < REPORT_INTERVAL) {
704         HDF_LOGE("%{public}s: rateLevel cannot less than zero", __func__);
705         return HDF_FAILURE;
706     }
707     int64_t samplingInterval = rateLevel == REPORT_INTERVAL ? REPORT_INTERVAL : COMMON_REPORT_FREQUENCY / rateLevel;
708     int64_t reportInterval = REPORT_INTERVAL;
709     if (enabled) {
710         ret = SetBatchSenior(serviceId, sensorId, SDC, samplingInterval, reportInterval);
711         if (ret != SENSOR_SUCCESS) {
712             HDF_LOGE("%{public}s SetBatchSenior SDC failed, error code is %{public}d", __func__, ret);
713             return ret;
714         }
715         SENSOR_TRACE_START("sensorVdiImpl_->Enable");
716         ret = sensorVdiImpl_->Enable(sensorId);
717         SENSOR_TRACE_FINISH;
718         if (ret != SENSOR_SUCCESS) {
719             HDF_LOGE("%{public}s Enable failed, error code is %{public}d", __func__, ret);
720             return ret;
721         }
722     } else {
723         SensorClientsManager::GetInstance()->EraseSdcSensorBestConfig(sensorId);
724         ret = DisableSensor(sensorId, serviceId);
725         if (ret != SENSOR_SUCCESS) {
726             HDF_LOGE("%{public}s Disable failed, error code is %{public}d", __func__, ret);
727             return ret;
728         }
729         SensorClientsManager::GetInstance()->GetSensorBestConfig(sensorId, samplingInterval, reportInterval);
730         SENSOR_TRACE_START("sensorVdiImpl_->SetSaBatch");
731         ret = sensorVdiImpl_->SetSaBatch(sensorId, samplingInterval, samplingInterval);
732         SENSOR_TRACE_FINISH;
733         if (ret != SENSOR_SUCCESS) {
734             HDF_LOGE("%{public}s SetSaBatch failed, error code is %{public}d", __func__, ret);
735             return ret;
736         }
737     }
738     return ret;
739 }
740 
GetSdcSensorInfo(std::vector<SdcSensorInfo> & sdcSensorInfo)741 int32_t SensorIfService::GetSdcSensorInfo(std::vector<SdcSensorInfo>& sdcSensorInfo)
742 {
743     SENSOR_TRACE_PID;
744     uint32_t serviceId = static_cast<uint32_t>(HdfRemoteGetCallingPid());
745     HDF_LOGI("%{public}s: serviceId %{public}d", __func__, serviceId);
746     std::unique_lock<std::mutex> lock(sensorServiceMutex_);
747     if (sensorVdiImpl_ == nullptr) {
748         HDF_LOGE("%{public}s: get sensor vdi impl failed", __func__);
749         return HDF_FAILURE;
750     }
751 
752     std::vector<OHOS::HDI::Sensor::V1_1::SdcSensorInfoVdi> sdcSensorInfoVdi;
753     SENSOR_TRACE_START("sensorVdiImpl_->GetSdcSensorInfo");
754     int32_t ret = sensorVdiImpl_->GetSdcSensorInfo(sdcSensorInfoVdi);
755     SENSOR_TRACE_FINISH;
756     if (ret != SENSOR_SUCCESS) {
757         HDF_LOGE("%{public}s GetSdcSensorInfo failed, error code is %{public}d", __func__, ret);
758     }
759 
760     for (auto infoVdi : sdcSensorInfoVdi) {
761         SdcSensorInfo info;
762         info.offset = infoVdi.offset;
763         info.sensorId = infoVdi.sensorId;
764         info.ddrSize = infoVdi.ddrSize;
765         info.minRateLevel = infoVdi.minRateLevel;
766         info.maxRateLevel = infoVdi.maxRateLevel;
767         info.memAddr = infoVdi.memAddr;
768         info.reserved = infoVdi.reserved;
769         sdcSensorInfo.push_back(std::move(info));
770     }
771 
772     return ret;
773 }
774 
SensorInterfaceImplGetInstance(void)775 extern "C" ISensorInterface *SensorInterfaceImplGetInstance(void)
776 {
777     SensorIfService *impl = new (std::nothrow) SensorIfService();
778     if (impl == nullptr) {
779         return nullptr;
780     }
781 
782     int32_t ret = impl->Init();
783     if (ret != HDF_SUCCESS) {
784         HDF_LOGE("%{public}s: service init failed, error code is %{public}d", __func__, ret);
785         delete impl;
786         return nullptr;
787     }
788 
789     return impl;
790 }
791 } // namespace V2_0
792 } // namespace Sensor
793 } // namespace HDI
794 } // namespace OHOS