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