1# vibrator 2 3- [简介](##简介) 4- [目录](##目录) 5- [说明](##说明) 6 - [接口说明](###接口说明) 7 - [使用说明](###使用说明) 8 9- [相关仓](##相关仓) 10 11## 简介 12 13Vibrator驱动模型主要包含Vibrator(马达)相关的HDI接口与实现,提供Vibrator HDI( Hardware Device Interface )能力接口,支持三种振动效果:静态HCS配置的时间序列,动态配置持续时间,动态配置持续时间、振动强度、振动频率。调用StartOnce接口动态配置持续振动时间;调用StartEffect接口启动静态配置的振动效果;调用EnableVibratorModulation接口启动动态配置的振动效果。 14 15**图 1** Vibrator驱动模型图 16 17 18 19## 目录 20 21Vibraor驱动下源代码目录结构如下所示: 22 23``` 24/drivers/peripheral/vibrator 25├── chipset # vibrator模块器件驱动代码 26├── hal # vibrator模块hal层代码 27│ ├── include # vibrator模块hal层内部头文件 28│ └── src # vibrator模块hal层代码的实现 29├── interfaces # vibrator模块对上层服务提供的驱动能力接口 30│ └── include # vibrator模块对外提供的接口定义 31└── test # vibrator模块测试代码 32 └── unittest # vibrator模块单元测试代码 33``` 34 35## 说明 36 37### 接口说明 38 39马达主要提供的功能:触发振动,停止振动。开发能力如下表1: 40 41**表 1**马达的主要接口 42 43| 接口名 | 功能描述 | 44| ------------------------------------------------------------ | ------------------------------------------------------------ | 45| int32_t StartOnce(uint32_t duration) | 按照指定持续时间触发振动,duration为振动持续时长。 | 46| int32_t Start(const char *effectType) | 按照指定预置效果启动马达,effectType表示预置的振动效果串。 | 47| int32_t Stop(enum VibratorMode mode) | 按照指定的振动模式停止振动。 | 48| int32_t EnableVibratorModulation(uint32_t duration, int32_t intensity, int32_t frequency) | 按照指定振幅,频率、持续时间触发振动马达,duration为振动持续时长,intensity为振动强度,frequency为振动频率。 | 49| int32_t GetVibratorInfo(struct VibratorInfo **vibratorInfo); | 获取马达信息,包括是否支持振幅和频率的设置及振幅和频率的设置范围 。 | 50 51### 使用说明 52 53代码示例 54 55```c++ 56#include "vibrator_if.h" 57 58enum VibratorMode { 59 VIBRATOR_MODE_ONCE = 0, // 指定时间内的一次振动 60 VIBRATOR_MODE_PRESET = 1, // 指定预置效果的周期性振动 61}; 62 63void VibratorSample(void) 64{ 65 int32_t startRet; 66 int32_t endRet; 67 uint32_t g_duration = 1000; 68 uint32_t g_sleepTime1 = 2000; 69 uint32_t g_sleepTime2 = 5000; 70 int32_t g_intensity1 = 30; 71 int32_t g_frequency1 = 200; 72 const char *g_timeSequence = "haptic.clock.timer"; 73 struct VibratorInfo *g_vibratorInfo = nullptr; 74 /* 创建马达接口实例 */ 75 struct VibratorInterface *g_vibratorDev = NewVibratorInterfaceInstance(); 76 if (g_vibratorDev == NULL) { 77 return; 78 } 79 /* 获取马达信息,包括是否支持振幅和频率的设置及振幅和频率的设置范围。 */ 80 startRet = g_vibratorDev->GetVibratorInfo(&g_vibratorInfo); 81 if (startRet != 0) { 82 return; 83 } 84 /* 按照指定持续时间触发振动*/ 85 startRet = g_vibratorDev->StartOnce(g_duration); 86 if (startRet != 0) { 87 return; 88 } 89 OsalMSleep(g_sleepTime1); 90 /* 按照指定的振动模式停止振动 */ 91 endRet = g_vibratorDev->Stop(VIBRATOR_MODE_ONCE); 92 if (endRet != 0) { 93 return; 94 } 95 /* 按照指定预置效果启动马达 */ 96 startRet = g_vibratorDev->Start(g_timeSequence); 97 if (endRet != 0) { 98 return; 99 } 100 OsalMSleep(g_sleepTime2); 101 /* 按照指定的振动模式停止振动 */ 102 endRet = g_vibratorDev->Stop(VIBRATOR_MODE_PRESET); 103 if (endRet != 0) { 104 return; 105 } 106 /* 按照指定振幅,频率、持续时间触发振动马达。 */ 107 startRet = g_vibratorDev->EnableVibratorModulation(g_duration, g_intensity1, g_frequency1); 108 if (endRet != 0) { 109 return; 110 } 111 OsalMSleep(g_sleepTime1); 112 /* 按照指定的振动模式停止振动 */ 113 startRet = g_vibratorDev->Stop(VIBRATOR_MODE_ONCE); 114 if (endRet != 0) { 115 return; 116 } 117 /* 释放传感器接口实例 */ 118 ret = FreeVibratorInterfaceInstance(); 119 if (ret != 0) { 120 return; 121 } 122} 123``` 124 125## 相关仓 126 127[驱动子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E9%A9%B1%E5%8A%A8%E5%AD%90%E7%B3%BB%E7%BB%9F.md) 128 129[drivers_hdf_core](https://gitee.com/openharmony/drivers_hdf_core/blob/master/README_zh.md) 130 131[drivers_peripheral](https://gitee.com/openharmony/drivers_peripheral)