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