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