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