1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "sensor_impl.h" 17094332d3Sopenharmony_ci#include <cinttypes> 18094332d3Sopenharmony_ci#include <unordered_map> 19094332d3Sopenharmony_ci#include <mutex> 20094332d3Sopenharmony_ci#include <iproxy_broker.h> 21094332d3Sopenharmony_ci#include "sensor_uhdf_log.h" 22094332d3Sopenharmony_ci#include "hitrace_meter.h" 23094332d3Sopenharmony_ci#include "sensor_dump.h" 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_ci#define HDF_LOG_TAG uhdf_sensor_service 26094332d3Sopenharmony_ci#define DEFAULT_SDC_SENSOR_INFO_SIZE 2 27094332d3Sopenharmony_ci 28094332d3Sopenharmony_cinamespace OHOS { 29094332d3Sopenharmony_cinamespace HDI { 30094332d3Sopenharmony_cinamespace Sensor { 31094332d3Sopenharmony_cinamespace V1_1 { 32094332d3Sopenharmony_cinamespace { 33094332d3Sopenharmony_ci constexpr int32_t CALLBACK_CTOUNT_THRESHOLD = 1; 34094332d3Sopenharmony_ci using GroupIdCallBackMap = std::unordered_map<int32_t, std::vector<sptr<ISensorCallbackVdi>>>; 35094332d3Sopenharmony_ci GroupIdCallBackMap g_groupIdCallBackMap; 36094332d3Sopenharmony_ci std::mutex g_mutex; 37094332d3Sopenharmony_ci} // namespace 38094332d3Sopenharmony_ci 39094332d3Sopenharmony_ciint32_t ReportSensorEventsData(int32_t sensorType, const struct SensorEvents *event) 40094332d3Sopenharmony_ci{ 41094332d3Sopenharmony_ci std::lock_guard<std::mutex> lock(g_mutex); 42094332d3Sopenharmony_ci auto groupCallBackIter = g_groupIdCallBackMap.find(sensorType); 43094332d3Sopenharmony_ci if (groupCallBackIter == g_groupIdCallBackMap.end()) { 44094332d3Sopenharmony_ci return SENSOR_SUCCESS; 45094332d3Sopenharmony_ci } 46094332d3Sopenharmony_ci 47094332d3Sopenharmony_ci HdfSensorEventsVdi hdfSensorEvents; 48094332d3Sopenharmony_ci hdfSensorEvents.sensorId = event->sensorId; 49094332d3Sopenharmony_ci hdfSensorEvents.version = event->version; 50094332d3Sopenharmony_ci hdfSensorEvents.timestamp = event->timestamp; 51094332d3Sopenharmony_ci hdfSensorEvents.option = event->option; 52094332d3Sopenharmony_ci hdfSensorEvents.mode = event->mode; 53094332d3Sopenharmony_ci hdfSensorEvents.dataLen = event->dataLen; 54094332d3Sopenharmony_ci uint32_t len = event->dataLen; 55094332d3Sopenharmony_ci uint8_t *tmp = event->data; 56094332d3Sopenharmony_ci 57094332d3Sopenharmony_ci while ((len--) != 0) { 58094332d3Sopenharmony_ci hdfSensorEvents.data.push_back(*tmp); 59094332d3Sopenharmony_ci tmp++; 60094332d3Sopenharmony_ci } 61094332d3Sopenharmony_ci 62094332d3Sopenharmony_ci for (auto callBack : g_groupIdCallBackMap[sensorType]) { 63094332d3Sopenharmony_ci callBack->OnDataEventVdi(hdfSensorEvents); 64094332d3Sopenharmony_ci } 65094332d3Sopenharmony_ci 66094332d3Sopenharmony_ci return SENSOR_SUCCESS; 67094332d3Sopenharmony_ci} 68094332d3Sopenharmony_ci 69094332d3Sopenharmony_ciint32_t TradtionalSensorDataCallback(const struct SensorEvents *event) 70094332d3Sopenharmony_ci{ 71094332d3Sopenharmony_ci if (event == nullptr || event->data == nullptr) { 72094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, event or event.data is nullptr", __func__); 73094332d3Sopenharmony_ci return SENSOR_FAILURE; 74094332d3Sopenharmony_ci } 75094332d3Sopenharmony_ci 76094332d3Sopenharmony_ci (void)ReportSensorEventsData(TRADITIONAL_SENSOR_TYPE, event); 77094332d3Sopenharmony_ci 78094332d3Sopenharmony_ci return SENSOR_SUCCESS; 79094332d3Sopenharmony_ci} 80094332d3Sopenharmony_ci 81094332d3Sopenharmony_ciint32_t MedicalSensorDataCallback(const struct SensorEvents *event) 82094332d3Sopenharmony_ci{ 83094332d3Sopenharmony_ci if (event == nullptr || event->data == nullptr) { 84094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, event or event.data is nullptr", __func__); 85094332d3Sopenharmony_ci return SENSOR_FAILURE; 86094332d3Sopenharmony_ci } 87094332d3Sopenharmony_ci 88094332d3Sopenharmony_ci (void)ReportSensorEventsData(MEDICAL_SENSOR_TYPE, event); 89094332d3Sopenharmony_ci 90094332d3Sopenharmony_ci return SENSOR_SUCCESS; 91094332d3Sopenharmony_ci} 92094332d3Sopenharmony_ci 93094332d3Sopenharmony_ciSensorImpl::~SensorImpl() 94094332d3Sopenharmony_ci{ 95094332d3Sopenharmony_ci FreeSensorInterfaceInstance(); 96094332d3Sopenharmony_ci} 97094332d3Sopenharmony_ci 98094332d3Sopenharmony_ciint32_t SensorImpl::Init() 99094332d3Sopenharmony_ci{ 100094332d3Sopenharmony_ci sensorInterface = NewSensorInterfaceInstance(); 101094332d3Sopenharmony_ci if (sensorInterface == nullptr) { 102094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 103094332d3Sopenharmony_ci return HDF_FAILURE; 104094332d3Sopenharmony_ci } 105094332d3Sopenharmony_ci 106094332d3Sopenharmony_ci SensorDevRegisterDump(); 107094332d3Sopenharmony_ci return HDF_SUCCESS; 108094332d3Sopenharmony_ci} 109094332d3Sopenharmony_ci 110094332d3Sopenharmony_ciint32_t SensorImpl::GetAllSensorInfo(std::vector<HdfSensorInformationVdi> &info) 111094332d3Sopenharmony_ci{ 112094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Enter the GetAllSensorInfo function.", __func__); 113094332d3Sopenharmony_ci if (sensorInterface == nullptr || sensorInterface->GetAllSensors == nullptr) { 114094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 115094332d3Sopenharmony_ci return HDF_FAILURE; 116094332d3Sopenharmony_ci } 117094332d3Sopenharmony_ci 118094332d3Sopenharmony_ci struct SensorInformation *sensorInfo = nullptr; 119094332d3Sopenharmony_ci struct SensorInformation *tmp = nullptr; 120094332d3Sopenharmony_ci int32_t count = 0; 121094332d3Sopenharmony_ci 122094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_SENSORS, "GetAllSensorInfo"); 123094332d3Sopenharmony_ci int32_t ret = sensorInterface->GetAllSensors(&sensorInfo, &count); 124094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_SENSORS); 125094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 126094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret); 127094332d3Sopenharmony_ci return ret; 128094332d3Sopenharmony_ci } 129094332d3Sopenharmony_ci 130094332d3Sopenharmony_ci if (count <= 0) { 131094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, count<=0", __func__); 132094332d3Sopenharmony_ci return HDF_FAILURE; 133094332d3Sopenharmony_ci } 134094332d3Sopenharmony_ci 135094332d3Sopenharmony_ci tmp = sensorInfo; 136094332d3Sopenharmony_ci while (count--) { 137094332d3Sopenharmony_ci HdfSensorInformationVdi hdfSensorInfo; 138094332d3Sopenharmony_ci std::string sensorName(tmp->sensorName); 139094332d3Sopenharmony_ci hdfSensorInfo.sensorName = sensorName; 140094332d3Sopenharmony_ci std::string vendorName(tmp->vendorName); 141094332d3Sopenharmony_ci hdfSensorInfo.vendorName = vendorName; 142094332d3Sopenharmony_ci std::string firmwareVersion(tmp->firmwareVersion); 143094332d3Sopenharmony_ci hdfSensorInfo.firmwareVersion = firmwareVersion; 144094332d3Sopenharmony_ci std::string hardwareVersion(tmp->hardwareVersion); 145094332d3Sopenharmony_ci hdfSensorInfo.hardwareVersion = hardwareVersion; 146094332d3Sopenharmony_ci hdfSensorInfo.sensorTypeId = tmp->sensorTypeId; 147094332d3Sopenharmony_ci hdfSensorInfo.sensorId = tmp->sensorId; 148094332d3Sopenharmony_ci hdfSensorInfo.maxRange = tmp->maxRange; 149094332d3Sopenharmony_ci hdfSensorInfo.accuracy = tmp->accuracy; 150094332d3Sopenharmony_ci hdfSensorInfo.power = tmp->power; 151094332d3Sopenharmony_ci hdfSensorInfo.minDelay = tmp->minDelay; 152094332d3Sopenharmony_ci hdfSensorInfo.maxDelay = tmp->maxDelay; 153094332d3Sopenharmony_ci hdfSensorInfo.fifoMaxEventCount = tmp->fifoMaxEventCount; 154094332d3Sopenharmony_ci info.push_back(std::move(hdfSensorInfo)); 155094332d3Sopenharmony_ci tmp++; 156094332d3Sopenharmony_ci } 157094332d3Sopenharmony_ci 158094332d3Sopenharmony_ci return HDF_SUCCESS; 159094332d3Sopenharmony_ci} 160094332d3Sopenharmony_ci 161094332d3Sopenharmony_ciint32_t SensorImpl::Enable(int32_t sensorId) 162094332d3Sopenharmony_ci{ 163094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Enter the Enable function, sensorId is %{public}d", __func__, sensorId); 164094332d3Sopenharmony_ci if (sensorInterface == nullptr || sensorInterface->Enable == nullptr) { 165094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 166094332d3Sopenharmony_ci return HDF_FAILURE; 167094332d3Sopenharmony_ci } 168094332d3Sopenharmony_ci 169094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_SENSORS, "Enable"); 170094332d3Sopenharmony_ci int32_t ret = sensorInterface->Enable(sensorId); 171094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_SENSORS); 172094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 173094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret); 174094332d3Sopenharmony_ci } 175094332d3Sopenharmony_ci 176094332d3Sopenharmony_ci return ret; 177094332d3Sopenharmony_ci} 178094332d3Sopenharmony_ci 179094332d3Sopenharmony_ciint32_t SensorImpl::Disable(int32_t sensorId) 180094332d3Sopenharmony_ci{ 181094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Enter the Disable function, sensorId is %{public}d", __func__, sensorId); 182094332d3Sopenharmony_ci if (sensorInterface == nullptr || sensorInterface->Disable == nullptr) { 183094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 184094332d3Sopenharmony_ci return HDF_FAILURE; 185094332d3Sopenharmony_ci } 186094332d3Sopenharmony_ci 187094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_SENSORS, "Disable"); 188094332d3Sopenharmony_ci int32_t ret = sensorInterface->Disable(sensorId); 189094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_SENSORS); 190094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 191094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret); 192094332d3Sopenharmony_ci } 193094332d3Sopenharmony_ci 194094332d3Sopenharmony_ci return ret; 195094332d3Sopenharmony_ci} 196094332d3Sopenharmony_ci 197094332d3Sopenharmony_ciint32_t SensorImpl::SetBatch(int32_t sensorId, int64_t samplingInterval, int64_t reportInterval) 198094332d3Sopenharmony_ci{ 199094332d3Sopenharmony_ci HDF_LOGI("%{public}s: sensorId is %{public}d, samplingInterval is [%{public}" PRId64 "], \ 200094332d3Sopenharmony_ci reportInterval is [%{public}" PRId64 "].", __func__, sensorId, samplingInterval, reportInterval); 201094332d3Sopenharmony_ci if (sensorInterface == nullptr || sensorInterface->SetBatch == nullptr) { 202094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 203094332d3Sopenharmony_ci return HDF_FAILURE; 204094332d3Sopenharmony_ci } 205094332d3Sopenharmony_ci 206094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_SENSORS, "SetBatch"); 207094332d3Sopenharmony_ci int32_t ret = sensorInterface->SetBatch(sensorId, samplingInterval, reportInterval); 208094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_SENSORS); 209094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 210094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret); 211094332d3Sopenharmony_ci } 212094332d3Sopenharmony_ci 213094332d3Sopenharmony_ci return ret; 214094332d3Sopenharmony_ci} 215094332d3Sopenharmony_ci 216094332d3Sopenharmony_ciint32_t SensorImpl::SetMode(int32_t sensorId, int32_t mode) 217094332d3Sopenharmony_ci{ 218094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Enter the SetMode function, sensorId is %{public}d, mode is %{public}d", 219094332d3Sopenharmony_ci __func__, sensorId, mode); 220094332d3Sopenharmony_ci if (sensorInterface == nullptr || sensorInterface->SetMode == nullptr) { 221094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 222094332d3Sopenharmony_ci return HDF_FAILURE; 223094332d3Sopenharmony_ci } 224094332d3Sopenharmony_ci 225094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_SENSORS, "SetMode"); 226094332d3Sopenharmony_ci int32_t ret = sensorInterface->SetMode(sensorId, mode); 227094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_SENSORS); 228094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 229094332d3Sopenharmony_ci HDF_LOGE("%{public}s SetMode failed, error code is %{public}d", __func__, ret); 230094332d3Sopenharmony_ci } 231094332d3Sopenharmony_ci 232094332d3Sopenharmony_ci return ret; 233094332d3Sopenharmony_ci} 234094332d3Sopenharmony_ci 235094332d3Sopenharmony_ciint32_t SensorImpl::SetOption(int32_t sensorId, uint32_t option) 236094332d3Sopenharmony_ci{ 237094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Enter the SetOption function, sensorId is %{public}d, option is %{public}u", 238094332d3Sopenharmony_ci __func__, sensorId, option); 239094332d3Sopenharmony_ci if (sensorInterface == nullptr || sensorInterface->SetOption == nullptr) { 240094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 241094332d3Sopenharmony_ci return HDF_FAILURE; 242094332d3Sopenharmony_ci } 243094332d3Sopenharmony_ci 244094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_SENSORS, "SetOption"); 245094332d3Sopenharmony_ci int32_t ret = sensorInterface->SetOption(sensorId, option); 246094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_SENSORS); 247094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 248094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret); 249094332d3Sopenharmony_ci } 250094332d3Sopenharmony_ci 251094332d3Sopenharmony_ci return ret; 252094332d3Sopenharmony_ci} 253094332d3Sopenharmony_ci 254094332d3Sopenharmony_ciint32_t SensorImpl::Register(int32_t groupId, const sptr<ISensorCallbackVdi> &callbackObj) 255094332d3Sopenharmony_ci{ 256094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Enter the Register function, groupId is %{public}d", __func__, groupId); 257094332d3Sopenharmony_ci if (sensorInterface == nullptr || sensorInterface->Register == nullptr) { 258094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 259094332d3Sopenharmony_ci return HDF_FAILURE; 260094332d3Sopenharmony_ci } 261094332d3Sopenharmony_ci 262094332d3Sopenharmony_ci if (groupId < TRADITIONAL_SENSOR_TYPE || groupId > MEDICAL_SENSOR_TYPE) { 263094332d3Sopenharmony_ci HDF_LOGE("%{public}s: groupId [%{public}d] out of range", __func__, groupId); 264094332d3Sopenharmony_ci return SENSOR_INVALID_PARAM; 265094332d3Sopenharmony_ci } 266094332d3Sopenharmony_ci 267094332d3Sopenharmony_ci std::lock_guard<std::mutex> lock(g_mutex); 268094332d3Sopenharmony_ci auto groupCallBackIter = g_groupIdCallBackMap.find(groupId); 269094332d3Sopenharmony_ci if (groupCallBackIter != g_groupIdCallBackMap.end()) { 270094332d3Sopenharmony_ci auto callBackIter = 271094332d3Sopenharmony_ci find_if(g_groupIdCallBackMap[groupId].begin(), g_groupIdCallBackMap[groupId].end(), 272094332d3Sopenharmony_ci [&callbackObj](const sptr<ISensorCallbackVdi> &callbackRegistered) { 273094332d3Sopenharmony_ci const sptr<IRemoteObject> &lhs = callbackObj->HandleCallbackDeath(); 274094332d3Sopenharmony_ci const sptr<IRemoteObject> &rhs = callbackRegistered->HandleCallbackDeath(); 275094332d3Sopenharmony_ci return lhs == rhs; 276094332d3Sopenharmony_ci }); 277094332d3Sopenharmony_ci if (callBackIter == g_groupIdCallBackMap[groupId].end()) { 278094332d3Sopenharmony_ci g_groupIdCallBackMap[groupId].push_back(callbackObj); 279094332d3Sopenharmony_ci } 280094332d3Sopenharmony_ci return SENSOR_SUCCESS; 281094332d3Sopenharmony_ci } 282094332d3Sopenharmony_ci 283094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 284094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_SENSORS, "Register"); 285094332d3Sopenharmony_ci if (groupId == TRADITIONAL_SENSOR_TYPE) { 286094332d3Sopenharmony_ci ret = sensorInterface->Register(groupId, TradtionalSensorDataCallback); 287094332d3Sopenharmony_ci } else if (groupId == MEDICAL_SENSOR_TYPE) { 288094332d3Sopenharmony_ci ret = sensorInterface->Register(groupId, MedicalSensorDataCallback); 289094332d3Sopenharmony_ci } 290094332d3Sopenharmony_ci 291094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_SENSORS); 292094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 293094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Register fail, groupId[%{public}d]", __func__, groupId); 294094332d3Sopenharmony_ci return ret; 295094332d3Sopenharmony_ci } 296094332d3Sopenharmony_ci std::vector<sptr<ISensorCallbackVdi>> remoteVec; 297094332d3Sopenharmony_ci remoteVec.push_back(callbackObj); 298094332d3Sopenharmony_ci g_groupIdCallBackMap[groupId] = remoteVec; 299094332d3Sopenharmony_ci return ret; 300094332d3Sopenharmony_ci} 301094332d3Sopenharmony_ci 302094332d3Sopenharmony_ciint32_t SensorImpl::Unregister(int32_t groupId, const sptr<ISensorCallbackVdi> &callbackObj) 303094332d3Sopenharmony_ci{ 304094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Enter the Unregister function, groupId is %{public}d", __func__, groupId); 305094332d3Sopenharmony_ci if (sensorInterface == nullptr || sensorInterface->Unregister == nullptr) { 306094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 307094332d3Sopenharmony_ci return HDF_FAILURE; 308094332d3Sopenharmony_ci } 309094332d3Sopenharmony_ci std::lock_guard<std::mutex> lock(g_mutex); 310094332d3Sopenharmony_ci const sptr<IRemoteObject> &remote = callbackObj->HandleCallbackDeath(); 311094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_SENSORS, "Unregister"); 312094332d3Sopenharmony_ci int32_t ret = UnregisterImpl(groupId, remote.GetRefPtr()); 313094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_SENSORS); 314094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 315094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Unregister failed groupId[%{public}d]", __func__, groupId); 316094332d3Sopenharmony_ci } 317094332d3Sopenharmony_ci 318094332d3Sopenharmony_ci return ret; 319094332d3Sopenharmony_ci} 320094332d3Sopenharmony_ci 321094332d3Sopenharmony_ciint32_t SensorImpl::GetSdcSensorInfo(std::vector<SdcSensorInfoVdi> &sdcSensorInfoVdi) 322094332d3Sopenharmony_ci{ 323094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Enter the GetSdcSensorInfo function", __func__); 324094332d3Sopenharmony_ci if (sensorInterface == nullptr || sensorInterface->GetSdcSensorInfo == nullptr) { 325094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get sensor Module instance failed", __func__); 326094332d3Sopenharmony_ci return HDF_FAILURE; 327094332d3Sopenharmony_ci } 328094332d3Sopenharmony_ci 329094332d3Sopenharmony_ci StartTrace(HITRACE_TAG_SENSORS, "GetSdcSensorInfo"); 330094332d3Sopenharmony_ci struct SdcSensorInfo sdcSensorInfo[DEFAULT_SDC_SENSOR_INFO_SIZE]; 331094332d3Sopenharmony_ci int32_t ret = sensorInterface->GetSdcSensorInfo(sdcSensorInfo); 332094332d3Sopenharmony_ci FinishTrace(HITRACE_TAG_SENSORS); 333094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 334094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret); 335094332d3Sopenharmony_ci } 336094332d3Sopenharmony_ci 337094332d3Sopenharmony_ci for (auto info : sdcSensorInfo) { 338094332d3Sopenharmony_ci SdcSensorInfoVdi infoVdi; 339094332d3Sopenharmony_ci infoVdi.offset = info.offset; 340094332d3Sopenharmony_ci infoVdi.sensorId = info.sensorId; 341094332d3Sopenharmony_ci infoVdi.ddrSize = info.ddrSize; 342094332d3Sopenharmony_ci infoVdi.minRateLevel = info.minRateLevel; 343094332d3Sopenharmony_ci infoVdi.maxRateLevel = info.maxRateLevel; 344094332d3Sopenharmony_ci infoVdi.memAddr = info.memAddr; 345094332d3Sopenharmony_ci infoVdi.reserved = info.reserved; 346094332d3Sopenharmony_ci sdcSensorInfoVdi.push_back(std::move(infoVdi)); 347094332d3Sopenharmony_ci } 348094332d3Sopenharmony_ci 349094332d3Sopenharmony_ci return ret; 350094332d3Sopenharmony_ci} 351094332d3Sopenharmony_ci 352094332d3Sopenharmony_ciint32_t SensorImpl::UnregisterImpl(int32_t groupId, IRemoteObject *callbackObj) 353094332d3Sopenharmony_ci{ 354094332d3Sopenharmony_ci if (groupId < TRADITIONAL_SENSOR_TYPE || groupId > MEDICAL_SENSOR_TYPE) { 355094332d3Sopenharmony_ci HDF_LOGE("%{public}s: groupId [%{public}d] out of range", __func__, groupId); 356094332d3Sopenharmony_ci return SENSOR_INVALID_PARAM; 357094332d3Sopenharmony_ci } 358094332d3Sopenharmony_ci 359094332d3Sopenharmony_ci auto groupIdCallBackIter = g_groupIdCallBackMap.find(groupId); 360094332d3Sopenharmony_ci if (groupIdCallBackIter == g_groupIdCallBackMap.end()) { 361094332d3Sopenharmony_ci HDF_LOGE("%{public}s: groupId [%{public}d] callbackObj not registered", __func__, groupId); 362094332d3Sopenharmony_ci return HDF_FAILURE; 363094332d3Sopenharmony_ci } 364094332d3Sopenharmony_ci 365094332d3Sopenharmony_ci auto callBackIter = 366094332d3Sopenharmony_ci find_if(g_groupIdCallBackMap[groupId].begin(), g_groupIdCallBackMap[groupId].end(), 367094332d3Sopenharmony_ci [&callbackObj](const sptr<ISensorCallbackVdi> &callbackRegistered) { 368094332d3Sopenharmony_ci return callbackObj == (callbackRegistered->HandleCallbackDeath()).GetRefPtr(); 369094332d3Sopenharmony_ci }); 370094332d3Sopenharmony_ci if (callBackIter == g_groupIdCallBackMap[groupId].end()) { 371094332d3Sopenharmony_ci HDF_LOGE("%{public}s: groupId [%{public}d] callbackObj not registered", __func__, groupId); 372094332d3Sopenharmony_ci return HDF_FAILURE; 373094332d3Sopenharmony_ci } 374094332d3Sopenharmony_ci 375094332d3Sopenharmony_ci /** 376094332d3Sopenharmony_ci * when there is only one item in the vector,can call the Unregister function. 377094332d3Sopenharmony_ci * when there is more than one item in the vector, only need to remove the callbackObj 378094332d3Sopenharmony_ci * from the vector 379094332d3Sopenharmony_ci */ 380094332d3Sopenharmony_ci if (g_groupIdCallBackMap[groupId].size() > CALLBACK_CTOUNT_THRESHOLD) { 381094332d3Sopenharmony_ci g_groupIdCallBackMap[groupId].erase(callBackIter); 382094332d3Sopenharmony_ci return SENSOR_SUCCESS; 383094332d3Sopenharmony_ci } 384094332d3Sopenharmony_ci 385094332d3Sopenharmony_ci int32_t ret = HDF_FAILURE; 386094332d3Sopenharmony_ci if (groupId == TRADITIONAL_SENSOR_TYPE) { 387094332d3Sopenharmony_ci ret = sensorInterface->Unregister(groupId, TradtionalSensorDataCallback); 388094332d3Sopenharmony_ci } else if (groupId == MEDICAL_SENSOR_TYPE) { 389094332d3Sopenharmony_ci ret = sensorInterface->Unregister(groupId, MedicalSensorDataCallback); 390094332d3Sopenharmony_ci } 391094332d3Sopenharmony_ci 392094332d3Sopenharmony_ci if (ret != SENSOR_SUCCESS) { 393094332d3Sopenharmony_ci HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, ret); 394094332d3Sopenharmony_ci return ret; 395094332d3Sopenharmony_ci } 396094332d3Sopenharmony_ci 397094332d3Sopenharmony_ci g_groupIdCallBackMap.erase(groupId); 398094332d3Sopenharmony_ci 399094332d3Sopenharmony_ci return ret; 400094332d3Sopenharmony_ci} 401094332d3Sopenharmony_ci 402094332d3Sopenharmony_cistatic int32_t CreateSensorVdiInstance(struct HdfVdiBase *vdiBase) 403094332d3Sopenharmony_ci{ 404094332d3Sopenharmony_ci HDF_LOGI("%{public}s", __func__); 405094332d3Sopenharmony_ci if (vdiBase == nullptr) { 406094332d3Sopenharmony_ci HDF_LOGI("%{public}s: parameter vdiBase is NULL", __func__); 407094332d3Sopenharmony_ci return HDF_FAILURE; 408094332d3Sopenharmony_ci } 409094332d3Sopenharmony_ci 410094332d3Sopenharmony_ci struct WrapperSensorVdi *sensorVdi = reinterpret_cast<struct WrapperSensorVdi *>(vdiBase); 411094332d3Sopenharmony_ci sensorVdi->sensorModule = new SensorImpl(); 412094332d3Sopenharmony_ci if (sensorVdi->sensorModule == nullptr) { 413094332d3Sopenharmony_ci HDF_LOGI("%{public}s: new sensorModule failed!", __func__); 414094332d3Sopenharmony_ci return HDF_FAILURE; 415094332d3Sopenharmony_ci } 416094332d3Sopenharmony_ci return HDF_SUCCESS; 417094332d3Sopenharmony_ci} 418094332d3Sopenharmony_ci 419094332d3Sopenharmony_cistatic int32_t DestorySensorVdiInstance(struct HdfVdiBase *vdiBase) 420094332d3Sopenharmony_ci{ 421094332d3Sopenharmony_ci HDF_LOGI("%{public}s", __func__); 422094332d3Sopenharmony_ci if (vdiBase == nullptr) { 423094332d3Sopenharmony_ci HDF_LOGI("%{public}s: parameter vdiBase is NULL", __func__); 424094332d3Sopenharmony_ci return HDF_FAILURE; 425094332d3Sopenharmony_ci } 426094332d3Sopenharmony_ci 427094332d3Sopenharmony_ci struct WrapperSensorVdi *sensorVdi = reinterpret_cast<struct WrapperSensorVdi *>(vdiBase); 428094332d3Sopenharmony_ci SensorImpl *impl = reinterpret_cast<SensorImpl *>(sensorVdi->sensorModule); 429094332d3Sopenharmony_ci if (impl != nullptr) { 430094332d3Sopenharmony_ci delete impl; 431094332d3Sopenharmony_ci sensorVdi->sensorModule = nullptr; 432094332d3Sopenharmony_ci } 433094332d3Sopenharmony_ci return HDF_SUCCESS; 434094332d3Sopenharmony_ci} 435094332d3Sopenharmony_ci 436094332d3Sopenharmony_cistatic struct WrapperSensorVdi g_sensorVdi = { 437094332d3Sopenharmony_ci .base = { 438094332d3Sopenharmony_ci .moduleVersion = 1, 439094332d3Sopenharmony_ci .moduleName = "sensor_Service", 440094332d3Sopenharmony_ci .CreateVdiInstance = CreateSensorVdiInstance, 441094332d3Sopenharmony_ci .DestoryVdiInstance = DestorySensorVdiInstance, 442094332d3Sopenharmony_ci }, 443094332d3Sopenharmony_ci .sensorModule = nullptr, 444094332d3Sopenharmony_ci}; 445094332d3Sopenharmony_ci 446094332d3Sopenharmony_ciextern "C" HDF_VDI_INIT(g_sensorVdi); 447094332d3Sopenharmony_ci 448094332d3Sopenharmony_ci} // namespace V1_1 449094332d3Sopenharmony_ci} // namespace Sensor 450094332d3Sopenharmony_ci} // namespace HDI 451094332d3Sopenharmony_ci} // namespace OHOS 452