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