1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2022-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 "vibrator_if_service.h"
17094332d3Sopenharmony_ci#include <hdf_base.h>
18094332d3Sopenharmony_ci#include "vibrator_uhdf_log.h"
19094332d3Sopenharmony_ci#include "hitrace_meter.h"
20094332d3Sopenharmony_ci
21094332d3Sopenharmony_ci#define HDF_LOG_TAG    "uhdf_vibrator_service"
22094332d3Sopenharmony_ci
23094332d3Sopenharmony_cinamespace OHOS {
24094332d3Sopenharmony_cinamespace HDI {
25094332d3Sopenharmony_cinamespace Vibrator {
26094332d3Sopenharmony_cinamespace V1_3 {
27094332d3Sopenharmony_ciVibratorIfService::VibratorIfService()
28094332d3Sopenharmony_ci{
29094332d3Sopenharmony_ci    int32_t ret = GetVibratorVdiImpl();
30094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
31094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get vibrator vdi instance failed", __func__);
32094332d3Sopenharmony_ci    }
33094332d3Sopenharmony_ci}
34094332d3Sopenharmony_ci
35094332d3Sopenharmony_ciVibratorIfService::~VibratorIfService()
36094332d3Sopenharmony_ci{
37094332d3Sopenharmony_ci    if (vdi_ != nullptr) {
38094332d3Sopenharmony_ci        HdfCloseVdi(vdi_);
39094332d3Sopenharmony_ci    }
40094332d3Sopenharmony_ci}
41094332d3Sopenharmony_ci
42094332d3Sopenharmony_ciint32_t VibratorIfService::GetVibratorVdiImpl()
43094332d3Sopenharmony_ci{
44094332d3Sopenharmony_ci    struct VdiWrapperVibrator *vdiWrapperVibrator = nullptr;
45094332d3Sopenharmony_ci    uint32_t version = 0;
46094332d3Sopenharmony_ci    vdi_ = HdfLoadVdi(HDI_VIBRATOR_VDI_LIBNAME);
47094332d3Sopenharmony_ci    if (vdi_ == nullptr || vdi_->vdiBase == nullptr) {
48094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: load vibrator vdi failed", __func__);
49094332d3Sopenharmony_ci        return HDF_FAILURE;
50094332d3Sopenharmony_ci    }
51094332d3Sopenharmony_ci
52094332d3Sopenharmony_ci    version = HdfGetVdiVersion(vdi_);
53094332d3Sopenharmony_ci    if (version != 1) {
54094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get vibrator vdi version failed", __func__);
55094332d3Sopenharmony_ci        return HDF_FAILURE;
56094332d3Sopenharmony_ci    }
57094332d3Sopenharmony_ci
58094332d3Sopenharmony_ci    vdiWrapperVibrator = reinterpret_cast<struct VdiWrapperVibrator *>(vdi_->vdiBase);
59094332d3Sopenharmony_ci    vibratorVdiImpl_ = vdiWrapperVibrator->vibratorModule;
60094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
61094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get vibrator impl failed", __func__);
62094332d3Sopenharmony_ci        return HDF_FAILURE;
63094332d3Sopenharmony_ci    }
64094332d3Sopenharmony_ci
65094332d3Sopenharmony_ci    return HDF_SUCCESS;
66094332d3Sopenharmony_ci}
67094332d3Sopenharmony_ci
68094332d3Sopenharmony_ciint32_t VibratorIfService::Init()
69094332d3Sopenharmony_ci{
70094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
71094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
72094332d3Sopenharmony_ci        return HDF_FAILURE;
73094332d3Sopenharmony_ci    }
74094332d3Sopenharmony_ci
75094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->Init();
76094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
77094332d3Sopenharmony_ci        HDF_LOGE("%{public}s Init failed, error code is %{public}d", __func__, ret);
78094332d3Sopenharmony_ci    }
79094332d3Sopenharmony_ci
80094332d3Sopenharmony_ci    return ret;
81094332d3Sopenharmony_ci}
82094332d3Sopenharmony_ci
83094332d3Sopenharmony_ciint32_t VibratorIfService::StartOnce(uint32_t duration)
84094332d3Sopenharmony_ci{
85094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the StartOnce function, duration is %{public}u", __func__, duration);
86094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
87094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
88094332d3Sopenharmony_ci        return HDF_FAILURE;
89094332d3Sopenharmony_ci    }
90094332d3Sopenharmony_ci
91094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "StartOnce");
92094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->StartOnce(duration);
93094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
94094332d3Sopenharmony_ci        HDF_LOGE("%{public}s StartOnce failed, error code is %{public}d", __func__, ret);
95094332d3Sopenharmony_ci    }
96094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
97094332d3Sopenharmony_ci
98094332d3Sopenharmony_ci    return ret;
99094332d3Sopenharmony_ci}
100094332d3Sopenharmony_ci
101094332d3Sopenharmony_ciint32_t VibratorIfService::Start(const std::string &effectType)
102094332d3Sopenharmony_ci{
103094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the Start function", __func__);
104094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
105094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
106094332d3Sopenharmony_ci        return HDF_FAILURE;
107094332d3Sopenharmony_ci    }
108094332d3Sopenharmony_ci
109094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "Start");
110094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->Start(effectType);
111094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
112094332d3Sopenharmony_ci        HDF_LOGE("%{public}s Start failed, error code is %{public}d", __func__, ret);
113094332d3Sopenharmony_ci    }
114094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
115094332d3Sopenharmony_ci
116094332d3Sopenharmony_ci    return ret;
117094332d3Sopenharmony_ci}
118094332d3Sopenharmony_ci
119094332d3Sopenharmony_ciint32_t VibratorIfService::Stop(HdfVibratorMode mode)
120094332d3Sopenharmony_ci{
121094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the Stop function, mode: %{public}d", __func__, mode);
122094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
123094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
124094332d3Sopenharmony_ci        return HDF_FAILURE;
125094332d3Sopenharmony_ci    }
126094332d3Sopenharmony_ci
127094332d3Sopenharmony_ci    HdfVibratorModeVdi vibratorMode;
128094332d3Sopenharmony_ci    if (mode == HdfVibratorMode::HDF_VIBRATOR_MODE_ONCE) {
129094332d3Sopenharmony_ci        vibratorMode = VDI_VIBRATOR_MODE_ONCE;
130094332d3Sopenharmony_ci    } else if (mode == HdfVibratorMode::HDF_VIBRATOR_MODE_PRESET) {
131094332d3Sopenharmony_ci        vibratorMode = VDI_VIBRATOR_MODE_PRESET;
132094332d3Sopenharmony_ci    } else if (mode == HdfVibratorMode::HDF_VIBRATOR_MODE_BUTT) {
133094332d3Sopenharmony_ci        vibratorMode = VDI_VIBRATOR_MODE_BUTT;
134094332d3Sopenharmony_ci    } else {
135094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid param", __func__);
136094332d3Sopenharmony_ci        return HDF_FAILURE;
137094332d3Sopenharmony_ci    }
138094332d3Sopenharmony_ci
139094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "Stop");
140094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->Stop(vibratorMode);
141094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
142094332d3Sopenharmony_ci        HDF_LOGE("%{public}s Stop failed, error code is %{public}d", __func__, ret);
143094332d3Sopenharmony_ci    }
144094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
145094332d3Sopenharmony_ci
146094332d3Sopenharmony_ci    return ret;
147094332d3Sopenharmony_ci}
148094332d3Sopenharmony_ci
149094332d3Sopenharmony_ciint32_t VibratorIfService::StopV1_2(int32_t mode)
150094332d3Sopenharmony_ci{
151094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the Stop function, mode: %{public}d", __func__, mode);
152094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
153094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
154094332d3Sopenharmony_ci        return HDF_FAILURE;
155094332d3Sopenharmony_ci    }
156094332d3Sopenharmony_ci
157094332d3Sopenharmony_ci    HdfVibratorModeVdi vibratorMode;
158094332d3Sopenharmony_ci    if (mode == HdfVibratorModeV1_2::HDF_VIBRATOR_MODE_ONCE) {
159094332d3Sopenharmony_ci        vibratorMode = VDI_VIBRATOR_MODE_ONCE;
160094332d3Sopenharmony_ci    } else if (mode == HdfVibratorModeV1_2::HDF_VIBRATOR_MODE_PRESET) {
161094332d3Sopenharmony_ci        vibratorMode = VDI_VIBRATOR_MODE_PRESET;
162094332d3Sopenharmony_ci    } else if (mode == HdfVibratorModeV1_2::HDF_VIBRATOR_MODE_HDHAPTIC) {
163094332d3Sopenharmony_ci        vibratorMode = VDI_VIBRATOR_MODE_HDHAPTIC;
164094332d3Sopenharmony_ci    } else if (mode == HdfVibratorModeV1_2::HDF_VIBRATOR_MODE_BUTT) {
165094332d3Sopenharmony_ci        vibratorMode = VDI_VIBRATOR_MODE_BUTT;
166094332d3Sopenharmony_ci    } else {
167094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid param", __func__);
168094332d3Sopenharmony_ci        return HDF_FAILURE;
169094332d3Sopenharmony_ci    }
170094332d3Sopenharmony_ci
171094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "Stop");
172094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->Stop(vibratorMode);
173094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
174094332d3Sopenharmony_ci        HDF_LOGE("%{public}s Stop failed, error code is %{public}d", __func__, ret);
175094332d3Sopenharmony_ci    }
176094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
177094332d3Sopenharmony_ci
178094332d3Sopenharmony_ci    return ret;
179094332d3Sopenharmony_ci}
180094332d3Sopenharmony_ci
181094332d3Sopenharmony_ciint32_t VibratorIfService::GetVibratorInfo(std::vector<HdfVibratorInfo> &vibratorInfo)
182094332d3Sopenharmony_ci{
183094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the GetVibratorInfo function.", __func__);
184094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
185094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
186094332d3Sopenharmony_ci        return HDF_FAILURE;
187094332d3Sopenharmony_ci    }
188094332d3Sopenharmony_ci
189094332d3Sopenharmony_ci    std::vector<HdfVibratorInfoVdi> vibratorInfoVdi;
190094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "GetVibratorInfo");
191094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->GetVibratorInfo(vibratorInfoVdi);
192094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
193094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetVibratorInfo failed, error code is %{public}d", __func__, ret);
194094332d3Sopenharmony_ci        return ret;
195094332d3Sopenharmony_ci    }
196094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
197094332d3Sopenharmony_ci
198094332d3Sopenharmony_ci    if (vibratorInfoVdi.empty()) {
199094332d3Sopenharmony_ci        HDF_LOGE("%{public}s no vibrator info in list", __func__);
200094332d3Sopenharmony_ci        return HDF_FAILURE;
201094332d3Sopenharmony_ci    }
202094332d3Sopenharmony_ci    for (const auto &iter : vibratorInfoVdi) {
203094332d3Sopenharmony_ci        HdfVibratorInfo hdfVibratorInfo;
204094332d3Sopenharmony_ci        hdfVibratorInfo.isSupportIntensity = iter.isSupportIntensity;
205094332d3Sopenharmony_ci        hdfVibratorInfo.isSupportFrequency = iter.isSupportFrequency;
206094332d3Sopenharmony_ci        hdfVibratorInfo.intensityMaxValue = iter.intensityMaxValue;
207094332d3Sopenharmony_ci        hdfVibratorInfo.intensityMinValue = iter.intensityMinValue;
208094332d3Sopenharmony_ci        hdfVibratorInfo.frequencyMaxValue = iter.frequencyMaxValue;
209094332d3Sopenharmony_ci        hdfVibratorInfo.frequencyMinValue = iter.frequencyMinValue;
210094332d3Sopenharmony_ci        vibratorInfo.push_back(std::move(hdfVibratorInfo));
211094332d3Sopenharmony_ci    }
212094332d3Sopenharmony_ci
213094332d3Sopenharmony_ci    return HDF_SUCCESS;
214094332d3Sopenharmony_ci}
215094332d3Sopenharmony_ci
216094332d3Sopenharmony_ciint32_t VibratorIfService::EnableVibratorModulation(uint32_t duration, uint16_t intensity, int16_t frequency)
217094332d3Sopenharmony_ci{
218094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: duration is %{public}u, intensity is %{public}u, frequency is %{public}d.",
219094332d3Sopenharmony_ci        __func__, duration, intensity, frequency);
220094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
221094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
222094332d3Sopenharmony_ci        return HDF_FAILURE;
223094332d3Sopenharmony_ci    }
224094332d3Sopenharmony_ci
225094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "EnableVibratorModulation");
226094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->EnableVibratorModulation(duration, intensity, frequency);
227094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
228094332d3Sopenharmony_ci        HDF_LOGE("%{public}s EnableVibratorModulation failed, error code is %{public}d", __func__, ret);
229094332d3Sopenharmony_ci    }
230094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
231094332d3Sopenharmony_ci
232094332d3Sopenharmony_ci    return ret;
233094332d3Sopenharmony_ci}
234094332d3Sopenharmony_ci
235094332d3Sopenharmony_ciint32_t VibratorIfService::EnableCompositeEffect(const HdfCompositeEffect &effect)
236094332d3Sopenharmony_ci{
237094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the EnableCompositeEffect function.", __func__);
238094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
239094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
240094332d3Sopenharmony_ci        return HDF_FAILURE;
241094332d3Sopenharmony_ci    }
242094332d3Sopenharmony_ci
243094332d3Sopenharmony_ci    std::vector<HdfEffectVdi> effectVdi;
244094332d3Sopenharmony_ci    for (const auto &compositeEffects : effect.compositeEffects) {
245094332d3Sopenharmony_ci        HdfEffectVdi hdfEffectVdi;
246094332d3Sopenharmony_ci        if (effect.type == HDF_EFFECT_TYPE_TIME) {
247094332d3Sopenharmony_ci            hdfEffectVdi.timeEffect.delay = compositeEffects.timeEffect.delay;
248094332d3Sopenharmony_ci            hdfEffectVdi.timeEffect.time = compositeEffects.timeEffect.time;
249094332d3Sopenharmony_ci            hdfEffectVdi.timeEffect.intensity = compositeEffects.timeEffect.intensity;
250094332d3Sopenharmony_ci            hdfEffectVdi.timeEffect.frequency = compositeEffects.timeEffect.frequency;
251094332d3Sopenharmony_ci        } else if (effect.type == HDF_EFFECT_TYPE_PRIMITIVE) {
252094332d3Sopenharmony_ci            hdfEffectVdi.primitiveEffect.delay = compositeEffects.primitiveEffect.delay;
253094332d3Sopenharmony_ci            hdfEffectVdi.primitiveEffect.effectId = compositeEffects.primitiveEffect.effectId;
254094332d3Sopenharmony_ci            hdfEffectVdi.primitiveEffect.intensity = compositeEffects.primitiveEffect.intensity;
255094332d3Sopenharmony_ci        }
256094332d3Sopenharmony_ci        effectVdi.push_back(std::move(hdfEffectVdi));
257094332d3Sopenharmony_ci    }
258094332d3Sopenharmony_ci
259094332d3Sopenharmony_ci    HdfCompositeEffectVdi compositeEffectVdi;
260094332d3Sopenharmony_ci    compositeEffectVdi.type = effect.type;
261094332d3Sopenharmony_ci    compositeEffectVdi.effects = effectVdi;
262094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "EnableCompositeEffect");
263094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->EnableCompositeEffect(compositeEffectVdi);
264094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
265094332d3Sopenharmony_ci        HDF_LOGE("%{public}s  EnableCompositeEffect failed, error code is %{public}d", __func__, ret);
266094332d3Sopenharmony_ci    }
267094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
268094332d3Sopenharmony_ci
269094332d3Sopenharmony_ci    return ret;
270094332d3Sopenharmony_ci}
271094332d3Sopenharmony_ci
272094332d3Sopenharmony_ciint32_t VibratorIfService::GetEffectInfo(const std::string &effectType, HdfEffectInfo &effectInfo)
273094332d3Sopenharmony_ci{
274094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the GetEffectInfo function.", __func__);
275094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
276094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
277094332d3Sopenharmony_ci        return HDF_FAILURE;
278094332d3Sopenharmony_ci    }
279094332d3Sopenharmony_ci
280094332d3Sopenharmony_ci    HdfEffectInfoVdi effectInfoVdi;
281094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "GetEffectInfo");
282094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->GetEffectInfo(effectType, effectInfoVdi);
283094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
284094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetEffectInfo failed, error code is %{public}d", __func__, ret);
285094332d3Sopenharmony_ci    }
286094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
287094332d3Sopenharmony_ci
288094332d3Sopenharmony_ci    effectInfo.isSupportEffect = effectInfoVdi.isSupportEffect;
289094332d3Sopenharmony_ci    effectInfo.duration = effectInfoVdi.duration;
290094332d3Sopenharmony_ci
291094332d3Sopenharmony_ci    return ret;
292094332d3Sopenharmony_ci}
293094332d3Sopenharmony_ci
294094332d3Sopenharmony_ciint32_t VibratorIfService::IsVibratorRunning(bool& state)
295094332d3Sopenharmony_ci{
296094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the IsVibratorRunning function", __func__);
297094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
298094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
299094332d3Sopenharmony_ci        return HDF_FAILURE;
300094332d3Sopenharmony_ci    }
301094332d3Sopenharmony_ci
302094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "IsVibratorRunning");
303094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->IsVibratorRunning(state);
304094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
305094332d3Sopenharmony_ci        HDF_LOGE("%{public}s IsVibratorRunning failed, error code is %{public}d", __func__, ret);
306094332d3Sopenharmony_ci    }
307094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
308094332d3Sopenharmony_ci
309094332d3Sopenharmony_ci    return ret;
310094332d3Sopenharmony_ci}
311094332d3Sopenharmony_ci
312094332d3Sopenharmony_ciint32_t VibratorIfService::PlayHapticPattern(const HapticPaket& pkg)
313094332d3Sopenharmony_ci{
314094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the PlayHapticPattern function", __func__);
315094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
316094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
317094332d3Sopenharmony_ci        return HDF_FAILURE;
318094332d3Sopenharmony_ci    }
319094332d3Sopenharmony_ci
320094332d3Sopenharmony_ci    HapticPaketVdi hapticPaketVdi;
321094332d3Sopenharmony_ci    hapticPaketVdi.time = pkg.time;
322094332d3Sopenharmony_ci    hapticPaketVdi.eventNum = pkg.eventNum;
323094332d3Sopenharmony_ci    for (const auto &event : pkg.events) {
324094332d3Sopenharmony_ci        HapticEventVdi hapticEventVdi;
325094332d3Sopenharmony_ci        if (event.type == CONTINUOUS) {
326094332d3Sopenharmony_ci            hapticEventVdi.type = VDI_CONTINUOUS;
327094332d3Sopenharmony_ci        } else if (event.type == TRANSIENT) {
328094332d3Sopenharmony_ci            hapticEventVdi.type = VDI_TRANSIENT;
329094332d3Sopenharmony_ci        }
330094332d3Sopenharmony_ci        hapticEventVdi.time = event.time;
331094332d3Sopenharmony_ci        hapticEventVdi.duration = event.duration;
332094332d3Sopenharmony_ci        hapticEventVdi.intensity = event.intensity;
333094332d3Sopenharmony_ci        hapticEventVdi.frequency = event.frequency;
334094332d3Sopenharmony_ci        hapticEventVdi.index = event.index;
335094332d3Sopenharmony_ci        hapticEventVdi.pointNum = event.pointNum;
336094332d3Sopenharmony_ci        for (const auto &point : event.points) {
337094332d3Sopenharmony_ci            CurvePointVdi curvePointVdip;
338094332d3Sopenharmony_ci            curvePointVdip.time = point.time;
339094332d3Sopenharmony_ci            curvePointVdip.intensity = point.intensity;
340094332d3Sopenharmony_ci            curvePointVdip.frequency = point.frequency;
341094332d3Sopenharmony_ci            hapticEventVdi.points.push_back(std::move(curvePointVdip));
342094332d3Sopenharmony_ci        }
343094332d3Sopenharmony_ci        hapticPaketVdi.events.push_back(std::move(hapticEventVdi));
344094332d3Sopenharmony_ci    }
345094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "PlayHapticPattern");
346094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->PlayHapticPattern(hapticPaketVdi);
347094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
348094332d3Sopenharmony_ci        HDF_LOGE("%{public}s PlayHapticPattern failed, error code is %{public}d", __func__, ret);
349094332d3Sopenharmony_ci    }
350094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
351094332d3Sopenharmony_ci
352094332d3Sopenharmony_ci    return ret;
353094332d3Sopenharmony_ci}
354094332d3Sopenharmony_ci
355094332d3Sopenharmony_ciint32_t VibratorIfService::GetHapticCapacity(HapticCapacity& hapticCapacity)
356094332d3Sopenharmony_ci{
357094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the GetHapticCapacity function", __func__);
358094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
359094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
360094332d3Sopenharmony_ci        return HDF_FAILURE;
361094332d3Sopenharmony_ci    }
362094332d3Sopenharmony_ci
363094332d3Sopenharmony_ci    HapticCapacityVdi hapticCapacityVdi;
364094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "GetHapticCapacity");
365094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->GetHapticCapacity(hapticCapacityVdi);
366094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
367094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetHapticCapacity failed, error code is %{public}d", __func__, ret);
368094332d3Sopenharmony_ci    }
369094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
370094332d3Sopenharmony_ci    hapticCapacity.isSupportHdHaptic = hapticCapacityVdi.isSupportHdHaptic;
371094332d3Sopenharmony_ci    hapticCapacity.isSupportPresetMapping = hapticCapacityVdi.isSupportPresetMapping;
372094332d3Sopenharmony_ci    hapticCapacity.isSupportTimeDelay = hapticCapacityVdi.isSupportTimeDelay;
373094332d3Sopenharmony_ci
374094332d3Sopenharmony_ci    return ret;
375094332d3Sopenharmony_ci}
376094332d3Sopenharmony_ci
377094332d3Sopenharmony_ciint32_t VibratorIfService::GetHapticStartUpTime(int32_t mode, int32_t& startUpTime)
378094332d3Sopenharmony_ci{
379094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the GetHapticStartUpTime function", __func__);
380094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
381094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
382094332d3Sopenharmony_ci        return HDF_FAILURE;
383094332d3Sopenharmony_ci    }
384094332d3Sopenharmony_ci
385094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "GetHapticStartUpTime");
386094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->GetHapticStartUpTime(mode, startUpTime);
387094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
388094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetHapticStartUpTime failed, error code is %{public}d", __func__, ret);
389094332d3Sopenharmony_ci    }
390094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
391094332d3Sopenharmony_ci
392094332d3Sopenharmony_ci    return ret;
393094332d3Sopenharmony_ci}
394094332d3Sopenharmony_ci
395094332d3Sopenharmony_ciint32_t VibratorIfService::StartByIntensity(const std::string& effectType, uint16_t intensity)
396094332d3Sopenharmony_ci{
397094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the StartByIntensity function", __func__);
398094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
399094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
400094332d3Sopenharmony_ci        return HDF_FAILURE;
401094332d3Sopenharmony_ci    }
402094332d3Sopenharmony_ci
403094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "StartByIntensity");
404094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->StartByIntensity(effectType, intensity);
405094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
406094332d3Sopenharmony_ci        HDF_LOGE("%{public}s StartByIntensity failed, error code is %{public}d", __func__, ret);
407094332d3Sopenharmony_ci    }
408094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
409094332d3Sopenharmony_ci
410094332d3Sopenharmony_ci    return ret;
411094332d3Sopenharmony_ci}
412094332d3Sopenharmony_ci
413094332d3Sopenharmony_ciint32_t VibratorIfService::GetAllWaveInfo(int32_t vibratorId, std::vector<HdfWaveInformation> &info)
414094332d3Sopenharmony_ci{
415094332d3Sopenharmony_ci    HDF_LOGD("%{public}s: Enter the GetAllWaveInfo function", __func__);
416094332d3Sopenharmony_ci    if (vibratorVdiImpl_ == nullptr) {
417094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: vibratorVdiImpl_ is nullptr", __func__);
418094332d3Sopenharmony_ci        return HDF_FAILURE;
419094332d3Sopenharmony_ci    }
420094332d3Sopenharmony_ci
421094332d3Sopenharmony_ci    StartTrace(HITRACE_TAG_HDF, "GetAllWaveInfo");
422094332d3Sopenharmony_ci    int32_t ret = vibratorVdiImpl_->GetAllWaveInfo(vibratorId, info);
423094332d3Sopenharmony_ci    FinishTrace(HITRACE_TAG_HDF);
424094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
425094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetAllWaveInfo failed, error code is %{public}d", __func__, ret);
426094332d3Sopenharmony_ci    }
427094332d3Sopenharmony_ci
428094332d3Sopenharmony_ci    return ret;
429094332d3Sopenharmony_ci}
430094332d3Sopenharmony_ci
431094332d3Sopenharmony_ciextern "C" IVibratorInterface *VibratorInterfaceImplGetInstance(void)
432094332d3Sopenharmony_ci{
433094332d3Sopenharmony_ci    VibratorIfService *impl = new (std::nothrow) VibratorIfService();
434094332d3Sopenharmony_ci    if (impl == nullptr) {
435094332d3Sopenharmony_ci        return nullptr;
436094332d3Sopenharmony_ci    }
437094332d3Sopenharmony_ci
438094332d3Sopenharmony_ci    int32_t ret = impl->Init();
439094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
440094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: service init failed, error code is %{public}d", __func__, ret);
441094332d3Sopenharmony_ci        delete impl;
442094332d3Sopenharmony_ci        return nullptr;
443094332d3Sopenharmony_ci    }
444094332d3Sopenharmony_ci
445094332d3Sopenharmony_ci    return impl;
446094332d3Sopenharmony_ci}
447094332d3Sopenharmony_ci} // V1_3
448094332d3Sopenharmony_ci} // Vibrator
449094332d3Sopenharmony_ci} // HDI
450094332d3Sopenharmony_ci} // OHOS
451