• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "vibrator_agent.h"
16 
17 #include "parameters.h"
18 
19 #include "sensors_errors.h"
20 #include "vibrator_service_client.h"
21 
22 #undef LOG_TAG
23 #define LOG_TAG "VibratorNDK"
24 
25 namespace OHOS {
26 namespace Sensors {
27 using OHOS::Sensors::VibratorServiceClient;
28 
29 namespace {
30 const std::string PHONE_TYPE = "phone";
31 const int32_t INTENSITY_ADJUST_MIN = 0;
32 const int32_t INTENSITY_ADJUST_MAX = 100;
33 const int32_t FREQUENCY_ADJUST_MIN = -100;
34 const int32_t FREQUENCY_ADJUST_MAX = 100;
35 } // namespace
36 
NormalizeErrCode(int32_t code)37 static int32_t NormalizeErrCode(int32_t code)
38 {
39     switch (code) {
40         case PERMISSION_DENIED: {
41             return PERMISSION_DENIED;
42         }
43         case PARAMETER_ERROR: {
44             return PARAMETER_ERROR;
45         }
46         case IS_NOT_SUPPORTED: {
47             return IS_NOT_SUPPORTED;
48         }
49         default: {
50             return DEVICE_OPERATION_FAILED;
51         }
52     }
53 }
54 
SetLoopCount(int32_t count)55 bool SetLoopCount(int32_t count)
56 {
57     VibratorIdentifier identifier = {
58         .deviceId = -1,
59         .vibratorId = -1
60     };
61     return SetLoopCountEnhanced(identifier, count);
62 }
63 
SetLoopCountEnhanced(const VibratorIdentifier identifier,int32_t count)64 bool SetLoopCountEnhanced(const VibratorIdentifier identifier, int32_t count)
65 {
66     if (count <= 0) {
67         MISC_HILOGE("Input invalid, count is %{public}d", count);
68         return false;
69     }
70     auto &client = VibratorServiceClient::GetInstance();
71     client.SetLoopCount(identifier, count);
72     return true;
73 }
74 
StartVibrator(const char * effectId)75 int32_t StartVibrator(const char *effectId)
76 {
77     VibratorIdentifier identifier = {
78         .deviceId = -1,
79         .vibratorId = -1
80     };
81     return StartVibratorEnhanced(identifier, effectId);
82 }
83 
StartVibratorEnhanced(const VibratorIdentifier identifier,const char * effectId)84 int32_t StartVibratorEnhanced(const VibratorIdentifier identifier, const char *effectId)
85 {
86     MISC_HILOGD("Time delay measurement:start time");
87     CHKPR(effectId, PARAMETER_ERROR);
88     auto &client = VibratorServiceClient::GetInstance();
89     VibratorEffectParameter vibratorEffectParameter = client.GetVibratorEffectParameter(identifier);
90     int32_t ret = client.Vibrate(identifier, effectId, vibratorEffectParameter.loopCount,
91         vibratorEffectParameter.usage, vibratorEffectParameter.systemUsage);
92     client.SetUsage(identifier, USAGE_UNKNOWN, false);
93     client.SetLoopCount(identifier, 1);
94     if (ret != ERR_OK) {
95         MISC_HILOGE("Vibrate effectId failed, ret:%{public}d", ret);
96         return NormalizeErrCode(ret);
97     }
98     return SUCCESS;
99 }
100 
StartVibratorOnce(int32_t duration)101 int32_t StartVibratorOnce(int32_t duration)
102 {
103     VibratorIdentifier identifier = {
104         .deviceId = -1,
105         .vibratorId = -1
106     };
107     return StartVibratorOnceEnhanced(identifier, duration);
108 }
109 
StartVibratorOnceEnhanced(const VibratorIdentifier identifier,int32_t duration)110 int32_t StartVibratorOnceEnhanced(const VibratorIdentifier identifier, int32_t duration)
111 {
112     if (duration <= 0) {
113         MISC_HILOGE("duration is invalid");
114         return PARAMETER_ERROR;
115     }
116     auto &client = VibratorServiceClient::GetInstance();
117     VibratorEffectParameter vibratorEffectParameter = client.GetVibratorEffectParameter(identifier);
118     int32_t ret = client.Vibrate(identifier, duration, vibratorEffectParameter.usage,
119         vibratorEffectParameter.systemUsage);
120     client.SetUsage(identifier, USAGE_UNKNOWN, false);
121     if (ret != ERR_OK) {
122         MISC_HILOGE("Vibrate duration failed, ret:%{public}d", ret);
123         return NormalizeErrCode(ret);
124     }
125     return SUCCESS;
126 }
127 
IsSupportVibratorCustom()128 bool IsSupportVibratorCustom()
129 {
130     VibratorIdentifier identifier = {
131         .deviceId = -1,
132         .vibratorId = -1
133     };
134     return IsSupportVibratorCustomEnhanced(identifier);
135 }
136 
IsSupportVibratorCustomEnhanced(const VibratorIdentifier identifier)137 bool IsSupportVibratorCustomEnhanced(const VibratorIdentifier identifier)
138 {
139     auto &client = VibratorServiceClient::GetInstance();
140     return client.IsSupportVibratorCustom(identifier);
141 }
142 
PlayVibratorCustom(int32_t fd,int64_t offset,int64_t length)143 int32_t PlayVibratorCustom(int32_t fd, int64_t offset, int64_t length)
144 {
145     VibratorIdentifier identifier = {
146         .deviceId = -1,
147         .vibratorId = -1
148     };
149     return PlayVibratorCustomEnhanced(identifier, fd, offset, length);
150 }
151 
PlayVibratorCustomEnhanced(const VibratorIdentifier identifier,int32_t fd,int64_t offset,int64_t length)152 int32_t PlayVibratorCustomEnhanced(const VibratorIdentifier identifier, int32_t fd, int64_t offset, int64_t length)
153 {
154 #ifdef OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM
155     MISC_HILOGD("Time delay measurement:start time");
156     if (fd < 0 || offset < 0 || length <= 0) {
157         MISC_HILOGE("Input parameter invalid, fd:%{public}d, offset:%{public}lld, length:%{public}lld",
158             fd, static_cast<long long>(offset), static_cast<long long>(length));
159         return PARAMETER_ERROR;
160     }
161     auto &client = VibratorServiceClient::GetInstance();
162     RawFileDescriptor rawFd = {
163         .fd = fd,
164         .offset = offset,
165         .length = length
166     };
167     VibratorEffectParameter vibratorEffectParameter = client.GetVibratorEffectParameter(identifier);
168     int32_t ret = client.PlayVibratorCustom(identifier, rawFd, vibratorEffectParameter.usage,
169         vibratorEffectParameter.systemUsage, vibratorEffectParameter.vibratorParameter);
170     vibratorEffectParameter.vibratorParameter.intensity = INTENSITY_ADJUST_MAX;
171     vibratorEffectParameter.vibratorParameter.frequency = 0;
172     client.SetUsage(identifier, USAGE_UNKNOWN, false);
173     client.SetParameters(identifier, vibratorEffectParameter.vibratorParameter);
174     if (ret != ERR_OK) {
175         MISC_HILOGE("PlayVibratorCustom failed, ret:%{public}d", ret);
176         return NormalizeErrCode(ret);
177     }
178     return SUCCESS;
179 #else
180     MISC_HILOGE("The device does not support this operation");
181     return IS_NOT_SUPPORTED;
182 #endif // OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM
183 }
184 
StopVibrator(const char * mode)185 int32_t StopVibrator(const char *mode)
186 {
187     VibratorIdentifier identifier = {
188         .deviceId = -1,
189         .vibratorId = -1
190     };
191     return StopVibratorEnhanced(identifier, mode);
192 }
193 
StopVibratorEnhanced(const VibratorIdentifier identifier,const char * mode)194 int32_t StopVibratorEnhanced(const VibratorIdentifier identifier, const char *mode)
195 {
196     CHKPR(mode, PARAMETER_ERROR);
197     if (strcmp(mode, "time") != 0 && strcmp(mode, "preset") != 0) {
198         MISC_HILOGE("Input parameter invalid, mode is %{public}s", mode);
199         return PARAMETER_ERROR;
200     }
201     auto &client = VibratorServiceClient::GetInstance();
202     int32_t ret = client.StopVibrator(identifier, mode);
203     if (ret != ERR_OK) {
204         MISC_HILOGE("StopVibrator by mode failed, ret:%{public}d, mode:%{public}s", ret, mode);
205         return NormalizeErrCode(ret);
206     }
207     return SUCCESS;
208 }
209 
Cancel()210 int32_t Cancel()
211 {
212     VibratorIdentifier identifier = {
213         .deviceId = -1,
214         .vibratorId = -1
215     };
216     return CancelEnhanced(identifier);
217 }
218 
CancelEnhanced(const VibratorIdentifier identifier)219 int32_t CancelEnhanced(const VibratorIdentifier identifier)
220 {
221     auto &client = VibratorServiceClient::GetInstance();
222     int32_t ret = client.StopVibrator(identifier);
223     if (ret != ERR_OK) {
224         MISC_HILOGE("StopVibrator failed, ret:%{public}d", ret);
225         return NormalizeErrCode(ret);
226     }
227     return SUCCESS;
228 }
229 
SetUsage(int32_t usage,bool systemUsage)230 bool SetUsage(int32_t usage, bool systemUsage)
231 {
232     VibratorIdentifier identifier = {
233         .deviceId = -1,
234         .vibratorId = -1
235     };
236     return SetUsageEnhanced(identifier, usage, systemUsage);
237 }
238 
SetUsageEnhanced(const VibratorIdentifier identifier,int32_t usage,bool systemUsage)239 bool SetUsageEnhanced(const VibratorIdentifier identifier, int32_t usage, bool systemUsage)
240 {
241     if ((usage < 0) || (usage >= USAGE_MAX)) {
242         MISC_HILOGE("Input invalid, usage is %{public}d", usage);
243         return false;
244     }
245     auto &client = VibratorServiceClient::GetInstance();
246     client.SetUsage(identifier, usage, systemUsage);
247     return true;
248 }
249 
IsHdHapticSupported()250 bool IsHdHapticSupported()
251 {
252     VibratorIdentifier identifier = {
253         .deviceId = -1,
254         .vibratorId = -1
255     };
256     return IsHdHapticSupportedEnhanced(identifier);
257 }
258 
IsHdHapticSupportedEnhanced(const VibratorIdentifier identifier)259 bool IsHdHapticSupportedEnhanced(const VibratorIdentifier identifier)
260 {
261     auto &client = VibratorServiceClient::GetInstance();
262     return client.IsHdHapticSupported(identifier);
263 }
264 
IsSupportEffect(const char * effectId,bool * state)265 int32_t IsSupportEffect(const char *effectId, bool *state)
266 {
267     VibratorIdentifier identifier = {
268         .deviceId = -1,
269         .vibratorId = -1
270     };
271     return IsSupportEffectEnhanced(identifier, effectId, state);
272 }
273 
IsSupportEffectEnhanced(const VibratorIdentifier identifier,const char * effectId,bool * state)274 int32_t IsSupportEffectEnhanced(const VibratorIdentifier identifier, const char *effectId, bool *state)
275 {
276     CHKPR(effectId, PARAMETER_ERROR);
277     auto &client = VibratorServiceClient::GetInstance();
278     int32_t ret = client.IsSupportEffect(identifier, effectId, *state);
279     if (ret != ERR_OK) {
280         MISC_HILOGE("Query effect support failed, ret:%{public}d, effectId:%{public}s", ret, effectId);
281         return NormalizeErrCode(ret);
282     }
283     return SUCCESS;
284 }
285 
PreProcess(const VibratorFileDescription & fd,VibratorPackage & package)286 int32_t PreProcess(const VibratorFileDescription &fd, VibratorPackage &package)
287 {
288     auto &client = VibratorServiceClient::GetInstance();
289     int32_t ret = client.PreProcess(fd, package);
290     if (ret != ERR_OK) {
291         MISC_HILOGE("DecodeVibratorFile failed, ret:%{public}d", ret);
292         return NormalizeErrCode(ret);
293     }
294     return SUCCESS;
295 }
296 
GetDelayTime(int32_t & delayTime)297 int32_t GetDelayTime(int32_t &delayTime)
298 {
299     VibratorIdentifier identifier = {
300         .deviceId = -1,
301         .vibratorId = -1
302     };
303     return GetDelayTimeEnhanced(identifier, delayTime);
304 }
305 
GetDelayTimeEnhanced(const VibratorIdentifier identifier,int32_t & delayTime)306 int32_t GetDelayTimeEnhanced(const VibratorIdentifier identifier, int32_t &delayTime)
307 {
308     auto &client = VibratorServiceClient::GetInstance();
309     int32_t ret = client.GetDelayTime(identifier, delayTime);
310     if (ret != ERR_OK) {
311         MISC_HILOGE("GetDelayTime failed, ret:%{public}d", ret);
312         return NormalizeErrCode(ret);
313     }
314     return SUCCESS;
315 }
316 
PlayPattern(const VibratorPattern & pattern)317 int32_t PlayPattern(const VibratorPattern &pattern)
318 {
319     VibratorIdentifier identifier = {
320         .deviceId = -1,
321         .vibratorId = -1
322     };
323     return PlayPatternEnhanced(identifier, pattern);
324 }
325 
PlayPatternEnhanced(const VibratorIdentifier identifier,const VibratorPattern & pattern)326 int32_t PlayPatternEnhanced(const VibratorIdentifier identifier, const VibratorPattern &pattern)
327 {
328     auto &client = VibratorServiceClient::GetInstance();
329     VibratorEffectParameter vibratorEffectParameter = client.GetVibratorEffectParameter(identifier);
330     int32_t ret = client.PlayPattern(identifier, pattern, vibratorEffectParameter.usage,
331         vibratorEffectParameter.systemUsage, vibratorEffectParameter.vibratorParameter);
332     vibratorEffectParameter.vibratorParameter.intensity = INTENSITY_ADJUST_MAX;
333     vibratorEffectParameter.vibratorParameter.frequency = 0;
334     client.SetUsage(identifier, USAGE_UNKNOWN, false);
335     client.SetParameters(identifier, vibratorEffectParameter.vibratorParameter);
336     if (ret != ERR_OK) {
337         MISC_HILOGE("PlayPattern failed, ret:%{public}d", ret);
338         return NormalizeErrCode(ret);
339     }
340     return SUCCESS;
341 }
342 
SeekTimeOnPackage(int32_t seekTime,const VibratorPackage & completePackage,VibratorPackage & seekPackage)343 int32_t SeekTimeOnPackage(int32_t seekTime, const VibratorPackage &completePackage, VibratorPackage &seekPackage)
344 {
345     auto &client = VibratorServiceClient::GetInstance();
346     int32_t ret = client.SeekTimeOnPackage(seekTime, completePackage, seekPackage);
347     if (ret != ERR_OK) {
348         MISC_HILOGE("SeekTimeOnPackage failed, ret:%{public}d", ret);
349         return NormalizeErrCode(ret);
350     }
351     return SUCCESS;
352 }
353 
ModulatePackage(VibratorCurvePoint * modulationCurve,const int32_t curvePointNum,const int32_t duration,const VibratorPackage & beforeModulationPackage,VibratorPackage & afterModulationPackage)354 int32_t ModulatePackage(VibratorCurvePoint* modulationCurve, const int32_t curvePointNum, const int32_t duration,
355     const VibratorPackage &beforeModulationPackage, VibratorPackage &afterModulationPackage)
356 {
357     VibratorEvent modulationEvent{.type = EVENT_TYPE_CONTINUOUS, .time = 0, .duration = duration,
358         .intensity = -1, .frequency = -1, .index = 0, .pointNum = curvePointNum,
359         .points = modulationCurve};
360     int32_t ret = VibratorServiceClient::ModulatePackage(
361         modulationEvent, beforeModulationPackage, afterModulationPackage);
362     if (ret != ERR_OK) {
363         MISC_HILOGE("ModulatePackage failed, ret:%{public}d", ret);
364         return NormalizeErrCode(ret);
365     }
366     return SUCCESS;
367 }
368 
FreeVibratorPackage(VibratorPackage & package)369 int32_t FreeVibratorPackage(VibratorPackage &package)
370 {
371     int32_t ret = VibratorServiceClient::FreeVibratorPackage(package);
372     if (ret != ERR_OK) {
373         MISC_HILOGE("FreeVibratorPackage failed, ret:%{public}d", ret);
374         return NormalizeErrCode(ret);
375     }
376     return SUCCESS;
377 }
378 
SetParameters(const VibratorParameter & parameter)379 bool SetParameters(const VibratorParameter &parameter)
380 {
381     VibratorIdentifier identifier = {
382         .deviceId = -1,
383         .vibratorId = -1
384     };
385     return SetParametersEnhanced(identifier, parameter);
386 }
387 
SetParametersEnhanced(const VibratorIdentifier identifier,const VibratorParameter & parameter)388 bool SetParametersEnhanced(const VibratorIdentifier identifier, const VibratorParameter &parameter)
389 {
390     if ((parameter.intensity < INTENSITY_ADJUST_MIN) || (parameter.intensity > INTENSITY_ADJUST_MAX) ||
391         (parameter.frequency < FREQUENCY_ADJUST_MIN) || (parameter.frequency > FREQUENCY_ADJUST_MAX)) {
392         MISC_HILOGE("Input invalid, intensity parameter is %{public}d, frequency parameter is %{public}d",
393             parameter.intensity, parameter.frequency);
394         return false;
395     }
396     auto &client = VibratorServiceClient::GetInstance();
397     client.SetParameters(identifier, parameter);
398     return true;
399 }
400 
PlayPrimitiveEffect(const char * effectId,int32_t intensity)401 int32_t PlayPrimitiveEffect(const char *effectId, int32_t intensity)
402 {
403     VibratorIdentifier identifier = {
404         .deviceId = -1,
405         .vibratorId = -1
406     };
407     return PlayPrimitiveEffectEnhanced(identifier, effectId, intensity);
408 }
409 
PlayPrimitiveEffectEnhanced(const VibratorIdentifier identifier,const char * effectId,int32_t intensity)410 int32_t PlayPrimitiveEffectEnhanced(const VibratorIdentifier identifier, const char *effectId, int32_t intensity)
411 {
412     MISC_HILOGD("Time delay measurement:start time");
413     CHKPR(effectId, PARAMETER_ERROR);
414     auto &client = VibratorServiceClient::GetInstance();
415     VibratorEffectParameter vibratorEffectParameter = client.GetVibratorEffectParameter(identifier);
416     PrimitiveEffect primitiveEffect;
417     primitiveEffect.intensity = intensity;
418     primitiveEffect.usage = vibratorEffectParameter.usage;
419     primitiveEffect.systemUsage = vibratorEffectParameter.systemUsage;
420     primitiveEffect.count = vibratorEffectParameter.loopCount;
421     int32_t ret = client.PlayPrimitiveEffect(identifier, effectId, primitiveEffect);
422     client.SetUsage(identifier, USAGE_UNKNOWN, false);
423     client.SetLoopCount(identifier, 1);
424     if (ret != ERR_OK) {
425         MISC_HILOGE("Play primitive effect failed, ret:%{public}d", ret);
426         return NormalizeErrCode(ret);
427     }
428     return SUCCESS;
429 }
430 
GetVibratorList(const VibratorIdentifier & identifier,std::vector<VibratorInfos> & vibratorInfo)431 int32_t GetVibratorList(const VibratorIdentifier& identifier, std::vector<VibratorInfos>& vibratorInfo)
432 {
433     CALL_LOG_ENTER;
434     CHKCR(&identifier, PARAMETER_ERROR, "Invalid parameters");
435     MISC_HILOGD("VibratorIdentifier = [deviceId = %{public}d, vibratorId = %{public}d]", identifier.deviceId,
436         identifier.vibratorId);
437     auto &client = VibratorServiceClient::GetInstance();
438     int32_t ret = client.GetVibratorList(identifier, vibratorInfo);
439     if (ret != ERR_OK) {
440         MISC_HILOGE("Get vibrator list failed, ret:%{public}d", ret);
441         return NormalizeErrCode(ret);
442     }
443     return SUCCESS;
444 }
445 
GetEffectInfo(const VibratorIdentifier & identifier,const std::string & effectType,EffectInfo & effectInfo)446 int32_t GetEffectInfo(const VibratorIdentifier& identifier, const std::string& effectType, EffectInfo& effectInfo)
447 {
448     CALL_LOG_ENTER;
449     CHKCR(&identifier, PARAMETER_ERROR, "Invalid parameters");
450     MISC_HILOGD("VibratorIdentifier = [deviceId = %{public}d, vibratorId = %{public}d]", identifier.deviceId,
451         identifier.vibratorId);
452     auto &client = VibratorServiceClient::GetInstance();
453     int32_t ret = client.GetEffectInfo(identifier, effectType, effectInfo);
454     if (ret != ERR_OK) {
455         effectInfo.isSupportEffect = false;
456         MISC_HILOGW("Get effect info failed, ret:%{public}d", ret);
457     }
458     return SUCCESS;
459 }
460 
SubscribeVibratorPlug(const VibratorUser & user)461 int32_t SubscribeVibratorPlug(const VibratorUser& user)
462 {
463     CALL_LOG_ENTER;
464     CHKCR(user.callback, PARAMETER_ERROR, "Invalid parameters");
465     auto &client = VibratorServiceClient::GetInstance();
466     int32_t ret = client.SubscribeVibratorPlugInfo(&user);
467     if (ret != ERR_OK) {
468         MISC_HILOGE("SubscribeVibratorPlug failed, ret:%{public}d", ret);
469         return NormalizeErrCode(ret);
470     }
471     return SUCCESS;
472 }
473 
UnSubscribeVibratorPlug(const VibratorUser & user)474 int32_t UnSubscribeVibratorPlug(const VibratorUser& user)
475 {
476     CALL_LOG_ENTER;
477     CHKCR(user.callback, PARAMETER_ERROR, "Invalid parameters");
478     auto &client = VibratorServiceClient::GetInstance();
479     int32_t ret = client.UnsubscribeVibratorPlugInfo(&user);
480     if (ret != ERR_OK) {
481         MISC_HILOGE("UnsubscribeVibratorPlugInfo failed, ret:%{public}d", ret);
482         return NormalizeErrCode(ret);
483     }
484     return SUCCESS;
485 }
486 
PlayPatternBySessionId(uint32_t sessionId,const VibratorPattern & pattern)487 int32_t PlayPatternBySessionId(uint32_t sessionId, const VibratorPattern &pattern)
488 {
489     CALL_LOG_ENTER;
490     if (sessionId == 0) {
491         MISC_HILOGE("sessionId invalid, ret:%{public}d", sessionId);
492         return PARAMETER_ERROR;
493     }
494     VibratorIdentifier identifier = {
495         .deviceId = -1,
496         .vibratorId = -1
497     };
498     auto &client = VibratorServiceClient::GetInstance();
499     VibratorEffectParameter vibratorEffectParameter = client.GetVibratorEffectParameter(identifier);
500     vibratorEffectParameter.vibratorParameter.sessionId = sessionId;
501     int32_t ret = client.PlayPattern(identifier, pattern, vibratorEffectParameter.usage,
502         vibratorEffectParameter.systemUsage, vibratorEffectParameter.vibratorParameter);
503     vibratorEffectParameter.vibratorParameter.intensity = INTENSITY_ADJUST_MAX;
504     vibratorEffectParameter.vibratorParameter.frequency = 0;
505     client.SetUsage(identifier, USAGE_UNKNOWN, false);
506     client.SetParameters(identifier, vibratorEffectParameter.vibratorParameter);
507     if (ret != ERR_OK) {
508         MISC_HILOGE("PlayPatternBySessionId failed, ret:%{public}d", ret);
509         return NormalizeErrCode(ret);
510     }
511     return SUCCESS;
512 }
513 
PlayPackageBySessionId(uint32_t sessionId,const VibratorPackage & package)514 int32_t PlayPackageBySessionId(uint32_t sessionId, const VibratorPackage &package)
515 {
516     CALL_LOG_ENTER;
517     if (sessionId == 0) {
518         MISC_HILOGE("sessionId invalid, ret:%{public}d", sessionId);
519         return PARAMETER_ERROR;
520     }
521     VibratorIdentifier identifier = {
522         .deviceId = -1,
523         .vibratorId = -1
524     };
525     auto &client = VibratorServiceClient::GetInstance();
526     VibratorEffectParameter vibratorEffectParameter = client.GetVibratorEffectParameter(identifier);
527     vibratorEffectParameter.sessionId = sessionId;
528     int32_t ret = client.PlayPackageBySessionId(identifier, vibratorEffectParameter, package);
529     if (ret != ERR_OK) {
530         MISC_HILOGE("PlayPackageBySessionId failed, ret:%{public}d", ret);
531         return NormalizeErrCode(ret);
532     }
533     vibratorEffectParameter.vibratorParameter.intensity = INTENSITY_ADJUST_MAX;
534     vibratorEffectParameter.vibratorParameter.frequency = 0;
535     client.SetUsage(identifier, USAGE_UNKNOWN, false);
536     client.SetParameters(identifier, vibratorEffectParameter.vibratorParameter);
537     return SUCCESS;
538 }
539 
StopVibrateBySessionId(uint32_t sessionId)540 int32_t StopVibrateBySessionId(uint32_t sessionId)
541 {
542     CALL_LOG_ENTER;
543     if (sessionId == 0) {
544         MISC_HILOGE("sessionId invalid, ret:%{public}d", sessionId);
545         return PARAMETER_ERROR;
546     }
547     VibratorIdentifier identifier = {
548         .deviceId = -1,
549         .vibratorId = -1
550     };
551     int32_t ret = VibratorServiceClient::GetInstance().StopVibrateBySessionId(identifier, sessionId);
552     if (ret != ERR_OK) {
553         MISC_HILOGE("StopVibrateBySessionId failed, ret:%{public}d", ret);
554         return NormalizeErrCode(ret);
555     }
556     return SUCCESS;
557 }
558 } // namespace Sensors
559 } // namespace OHOS