158ec469eSopenharmony_ci# Misc Device<a name="EN-US_TOPIC_0000001148523206"></a> 258ec469eSopenharmony_ci 358ec469eSopenharmony_ci- [Introduction](#section11660541593) 458ec469eSopenharmony_ci- [Directory Structure](#section44981327519) 558ec469eSopenharmony_ci- [Constraints](#section98068674513) 658ec469eSopenharmony_ci- [Usage](#section1581412211528) 758ec469eSopenharmony_ci - [Available APIs](#section15684191115524) 858ec469eSopenharmony_ci - [How to Use](#section79302049192310) 958ec469eSopenharmony_ci 1058ec469eSopenharmony_ci- [Repositories Involved](#section96071132185310) 1158ec469eSopenharmony_ci 1258ec469eSopenharmony_ci## Introduction<a name="section11660541593"></a> 1358ec469eSopenharmony_ci 1458ec469eSopenharmony_ciMisc devices, including vibrators and LED indicators, are used to send signals externally. You can call APIs to control the vibration of vibrators and lighting-on and lighting-off of LED indicators. 1558ec469eSopenharmony_ci 1658ec469eSopenharmony_ci**Figure 1** Misc device architecture<a name="fig4460722185514"></a> 1758ec469eSopenharmony_ci 1858ec469eSopenharmony_ci 1958ec469eSopenharmony_ci 2058ec469eSopenharmony_ci 2158ec469eSopenharmony_ci## Directory Structure<a name="section44981327519"></a> 2258ec469eSopenharmony_ci 2358ec469eSopenharmony_ci``` 2458ec469eSopenharmony_ci/base/sensors/miscdevice 2558ec469eSopenharmony_ci├── frameworks # Framework code 2658ec469eSopenharmony_ci│ └── native # Native methods for the client to connect to services 2758ec469eSopenharmony_ci├── interfaces # External APIs 2858ec469eSopenharmony_ci│ ├── native # Native implementation 2958ec469eSopenharmony_ci│ └── plugin # JS APIs 3058ec469eSopenharmony_ci├── sa_profile # Configuration file of system ability names and dynamic libraries 3158ec469eSopenharmony_ci├── services # Code of services 3258ec469eSopenharmony_ci│ └── miscdevice_service # Misc device service, which is used to control the vibration of vibrators and lighting-on and lighting-off of LED lights 3358ec469eSopenharmony_ci└── utils # Common code, including permissions and communication capabilities 3458ec469eSopenharmony_ci``` 3558ec469eSopenharmony_ci 3658ec469eSopenharmony_ci## Constraints<a name="section98068674513"></a> 3758ec469eSopenharmony_ci 3858ec469eSopenharmony_ci- The APIs are valid only when your hardware is equipped with the required misc devices. 3958ec469eSopenharmony_ci- To use vibrators, you need to request the required permissions. 4058ec469eSopenharmony_ci 4158ec469eSopenharmony_ci **Table 1** Permissions required by misc devices 4258ec469eSopenharmony_ci 4358ec469eSopenharmony_ci <a name="table1379101653916"></a> 4458ec469eSopenharmony_ci <table><thead align="left"><tr id="row137911161397"><th class="cellrowborder" valign="top" width="15.728427157284273%" id="mcps1.2.5.1.1"><p id="p15138132134118"><a name="p15138132134118"></a><a name="p15138132134118"></a>Misc Device</p> 4558ec469eSopenharmony_ci </th> 4658ec469eSopenharmony_ci <th class="cellrowborder" valign="top" width="28.537146285371463%" id="mcps1.2.5.1.2"><p id="p2798169398"><a name="p2798169398"></a><a name="p2798169398"></a>Permission Name</p> 4758ec469eSopenharmony_ci </th> 4858ec469eSopenharmony_ci <th class="cellrowborder" valign="top" width="18.168183181681833%" id="mcps1.2.5.1.3"><p id="p14791716163914"><a name="p14791716163914"></a><a name="p14791716163914"></a>Sensitivity</p> 4958ec469eSopenharmony_ci </th> 5058ec469eSopenharmony_ci <th class="cellrowborder" valign="top" width="37.56624337566243%" id="mcps1.2.5.1.4"><p id="p379171633919"><a name="p379171633919"></a><a name="p379171633919"></a>Permission Description</p> 5158ec469eSopenharmony_ci </th> 5258ec469eSopenharmony_ci </tr> 5358ec469eSopenharmony_ci </thead> 5458ec469eSopenharmony_ci <tbody><tr id="row12791216173912"><td class="cellrowborder" valign="top" width="15.728427157284273%" headers="mcps1.2.5.1.1 "><p id="p18658132191310"><a name="p18658132191310"></a><a name="p18658132191310"></a>Vibrator</p> 5558ec469eSopenharmony_ci </td> 5658ec469eSopenharmony_ci <td class="cellrowborder" valign="top" width="28.537146285371463%" headers="mcps1.2.5.1.2 "><p id="p8826341131218"><a name="p8826341131218"></a><a name="p8826341131218"></a>ohos.permission.VIBRATE</p> 5758ec469eSopenharmony_ci </td> 5858ec469eSopenharmony_ci <td class="cellrowborder" valign="top" width="18.168183181681833%" headers="mcps1.2.5.1.3 "><p id="p207991683914"><a name="p207991683914"></a><a name="p207991683914"></a>system_grant</p> 5958ec469eSopenharmony_ci </td> 6058ec469eSopenharmony_ci <td class="cellrowborder" valign="top" width="37.56624337566243%" headers="mcps1.2.5.1.4 "><p id="p118061614399"><a name="p118061614399"></a><a name="p118061614399"></a>Allows an application to use the vibrator.</p> 6158ec469eSopenharmony_ci </td> 6258ec469eSopenharmony_ci </tr> 6358ec469eSopenharmony_ci </tbody> 6458ec469eSopenharmony_ci </table> 6558ec469eSopenharmony_ci 6658ec469eSopenharmony_ci 6758ec469eSopenharmony_ci## Usage<a name="section1581412211528"></a> 6858ec469eSopenharmony_ci 6958ec469eSopenharmony_ciThis section describes the features and usage of the vibrator APIs. 7058ec469eSopenharmony_ci 7158ec469eSopenharmony_ci### Available APIs<a name="section15684191115524"></a> 7258ec469eSopenharmony_ci 7358ec469eSopenharmony_ciThe APIs provided for the vibrator are used to trigger and stop vibration. The following table describes these APIs. 7458ec469eSopenharmony_ci 7558ec469eSopenharmony_ci**Table 2** JS APIs for the vibrator 7658ec469eSopenharmony_ci 7758ec469eSopenharmony_ci<a name="table1738121244713"></a> 7858ec469eSopenharmony_ci 7958ec469eSopenharmony_ci<table><thead align="left"><tr id="row4381111254710"><th class="cellrowborder" valign="top" width="31.209999999999997%" id="mcps1.2.3.1.1"><p id="p1738116127470"><a name="p1738116127470"></a><a name="p1738116127470"></a>API</p> 8058ec469eSopenharmony_ci</th> 8158ec469eSopenharmony_ci<th class="cellrowborder" valign="top" width="68.78999999999999%" id="mcps1.2.3.1.2"><p id="p10381161224717"><a name="p10381161224717"></a><a name="p10381161224717"></a>Description</p> 8258ec469eSopenharmony_ci</th> 8358ec469eSopenharmony_ci</tr> 8458ec469eSopenharmony_ci</thead> 8558ec469eSopenharmony_ci<tbody><tr id="row18381121274715"><td class="cellrowborder" valign="top" width="31.209999999999997%" headers="mcps1.2.3.1.1 "><p id="p15297217910"><a name="p15297217910"></a><a name="p15297217910"></a>startVibration(effect: VibrateEffect, attribute: VibrateAttribute, callback?: AsyncCallback<void>)</p> 8658ec469eSopenharmony_ci</td> 8758ec469eSopenharmony_ci<td class="cellrowborder" valign="top" width="68.78999999999999%" headers="mcps1.2.3.1.2 "><p id="p143812128476"><a name="p143812128476"></a><a name="p143812128476"></a>Triggers vibration based on the vibration effect specified by <strong id="b137434619532"><a name="b137434619532"></a><a name="b137434619532"></a>effect</strong> and <strong id="b137434619532"><a name="b137434619532"></a><a name="b137434619532"></a>attribute</strong>. This API uses a callback to indicate whether the vibration is triggered successfully.</p> 8858ec469eSopenharmony_ci</td> 8958ec469eSopenharmony_ci</tr> 9058ec469eSopenharmony_ci<tr id="row29912332312"><td class="cellrowborder" valign="top" width="31.209999999999997%" headers="mcps1.2.3.1.1 "><p id="p599153172316"><a name="p599153172316"></a><a name="p599153172316"></a>startVibration(effect: VibrateEffect, attribute: VibrateAttribute): Promise<void></p> 9158ec469eSopenharmony_ci</td> 9258ec469eSopenharmony_ci<td class="cellrowborder" valign="top" width="68.78999999999999%" headers="mcps1.2.3.1.2 "><p id="p1099114392316"><a name="p1099114392316"></a><a name="p1099114392316"></a>Triggers vibration based on the vibration effect specified by <strong id="b137434619532"><a name="b137434619532"></a><a name="b137434619532"></a>effect</strong> and <strong id="b137434619532"><a name="b137434619532"></a><a name="b137434619532"></a>attribute</strong>. This API uses a promise to indicate whether the vibration is triggered successfully.</p> 9358ec469eSopenharmony_ci</td> 9458ec469eSopenharmony_ci</tr> 9558ec469eSopenharmony_ci<tr id="row10382181218477"><td class="cellrowborder" valign="top" width="31.209999999999997%" headers="mcps1.2.3.1.1 "><p id="p764313511343"><a name="p764313511343"></a><a name="p764313511343"></a>stopVibration(stopMode: VibratorStopMode, callback?: AsyncCallback<void>)</p> 9658ec469eSopenharmony_ci</td> 9758ec469eSopenharmony_ci<td class="cellrowborder" valign="top" width="68.78999999999999%" headers="mcps1.2.3.1.2 "><p id="p1738291234712"><a name="p1738291234712"></a><a name="p1738291234712"></a>Stops vibration based on the mode specified by <strong id="b1019916113564"><a name="b1019916113564"></a><a name="b1019916113564"></a>stopMode</strong>. There are two modes: <strong id="b1784893665611"><a name="b1784893665611"></a><a name="b1784893665611"></a>VIBRATOR_STOP_MODE_TIME</strong> and <strong id="b157644016560"><a name="b157644016560"></a><a name="b157644016560"></a>VIBRATOR_STOP_MODE_PRESET</strong>, which are used to stop vibration triggered by <strong id="b1217141320585"><a name="b1217141320585"></a><a name="b1217141320585"></a>duration</strong> and <strong id="b1639019514578"><a name="b1639019514578"></a><a name="b1639019514578"></a>effectId</strong>, respectively. This API uses a callback to indicate whether the vibration is stopped successfully.</p> 9858ec469eSopenharmony_ci</td> 9958ec469eSopenharmony_ci</tr> 10058ec469eSopenharmony_ci<tr id="row2087541618235"><td class="cellrowborder" valign="top" width="31.209999999999997%" headers="mcps1.2.3.1.1 "><p id="p13875201620231"><a name="p13875201620231"></a><a name="p13875201620231"></a>stopVibration(stopMode: VibratorStopMode): Promise<void></p> 10158ec469eSopenharmony_ci</td> 10258ec469eSopenharmony_ci<td class="cellrowborder" valign="top" width="68.78999999999999%" headers="mcps1.2.3.1.2 "><p id="p14875916142317"><a name="p14875916142317"></a><a name="p14875916142317"></a>Stops vibration based on the mode specified by <strong id="b128871517589"><a name="b128871517589"></a><a name="b128871517589"></a>stopMode</strong>. There are two modes: <strong id="b16566172217582"><a name="b16566172217582"></a><a name="b16566172217582"></a>VIBRATOR_STOP_MODE_TIME</strong> and <strong id="b1757216228581"><a name="b1757216228581"></a><a name="b1757216228581"></a>VIBRATOR_STOP_MODE_PRESET</strong>, which are used to stop vibration triggered by <strong id="b257214227586"><a name="b257214227586"></a><a name="b257214227586"></a>duration</strong> and <strong id="b457362275812"><a name="b457362275812"></a><a name="b457362275812"></a>effectId</strong>, respectively. This API uses a promise to indicate whether the vibration is stopped successfully.</p> 10358ec469eSopenharmony_ci</td> 10458ec469eSopenharmony_ci</tr> 10558ec469eSopenharmony_ci<tr id="row10382181218477"><td class="cellrowborder" valign="top" width="31.209999999999997%" headers="mcps1.2.3.1.1 "><p id="p764313511343"><a name="p764313511343"></a><a name="p764313511343"></a>stopVibration(callback: AsyncCallback<void>)</p> 10658ec469eSopenharmony_ci</td> 10758ec469eSopenharmony_ci<td class="cellrowborder" valign="top" width="68.78999999999999%" headers="mcps1.2.3.1.2 "><p id="p1738291234712"><a name="p1738291234712"></a><a name="p1738291234712"></a>Stop all types of vibration. This API uses a callback to indicate whether the vibration is stopped successfully.</p> 10858ec469eSopenharmony_ci</td> 10958ec469eSopenharmony_ci</tr> 11058ec469eSopenharmony_ci<tr id="row2087541618235"><td class="cellrowborder" valign="top" width="31.209999999999997%" headers="mcps1.2.3.1.1 "><p id="p13875201620231"><a name="p13875201620231"></a><a name="p13875201620231"></a>stopVibration(): Promise<void></p> 11158ec469eSopenharmony_ci</td> 11258ec469eSopenharmony_ci<td class="cellrowborder" valign="top" width="68.78999999999999%" headers="mcps1.2.3.1.2 "><p id="p14875916142317"><a name="p14875916142317"></a><a name="p14875916142317"></a>Stop all types of vibration. This API uses a promise to indicate whether the vibration is stopped successfully.</p> 11358ec469eSopenharmony_ci</td> 11458ec469eSopenharmony_ci</tr> 11558ec469eSopenharmony_ci<tr id="row10382181218477"><td class="cellrowborder" valign="top" width="31.209999999999997%" headers="mcps1.2.3.1.1 "><p id="p764313511343"><a name="p764313511343"></a><a name="p764313511343"></a>isSupportEffect(effectId: string, callback: AsyncCallback<boolean>)</p> 11658ec469eSopenharmony_ci</td> 11758ec469eSopenharmony_ci<td class="cellrowborder" valign="top" width="68.78999999999999%" headers="mcps1.2.3.1.2 "><p id="p1738291234712"><a name="p1738291234712"></a><a name="p1738291234712"></a>Query whether the <strong id="b128871517589"><a name="b128871517589"></a><a name="b128871517589"></a>effectId</strong> is supported. This API uses a callback to indicate whether the query result of EffectId is successful.</p> 11858ec469eSopenharmony_ci</td> 11958ec469eSopenharmony_ci</tr> 12058ec469eSopenharmony_ci<tr id="row2087541618235"><td class="cellrowborder" valign="top" width="31.209999999999997%" headers="mcps1.2.3.1.1 "><p id="p13875201620231"><a name="p13875201620231"></a><a name="p13875201620231"></a>isSupportEffect(effectId: string): Promise<boolean></p> 12158ec469eSopenharmony_ci</td> 12258ec469eSopenharmony_ci<td class="cellrowborder" valign="top" width="68.78999999999999%" headers="mcps1.2.3.1.2 "><p id="p14875916142317"><a name="p14875916142317"></a><a name="p14875916142317"></a>Query whether the <strong id="b128871517589"><a name="b128871517589"></a><a name="b128871517589"></a>effectId</strong> is supported. This API uses a promise to indicate whether the query result of EffectId is successful.</p> 12358ec469eSopenharmony_ci</td> 12458ec469eSopenharmony_ci</tr> 12558ec469eSopenharmony_ci</tbody> 12658ec469eSopenharmony_ci</table> 12758ec469eSopenharmony_ci 12858ec469eSopenharmony_ci 12958ec469eSopenharmony_ci### How to Use<a name="section79302049192310"></a> 13058ec469eSopenharmony_ci 13158ec469eSopenharmony_ci1. Import the **vibrator** package. 13258ec469eSopenharmony_ci2. Trigger vibration with a specific duration. 13358ec469eSopenharmony_ci3. Stop vibration that is triggered with a specific duration. 13458ec469eSopenharmony_ci4. Trigger vibration with a specific effect. 13558ec469eSopenharmony_ci5. Stop vibration that is triggered with a specific effect. 13658ec469eSopenharmony_ci6. Query whether 'haptic. lock. timer' is supported. If so, vibrate the effectId. 13758ec469eSopenharmony_ci7. Stop all types of vibration. 13858ec469eSopenharmony_ci 13958ec469eSopenharmony_ciThe following sample code provides a complete process of using the vibrator APIs: 14058ec469eSopenharmony_ci 14158ec469eSopenharmony_ci``` 14258ec469eSopenharmony_ci//Step 1 Import the vibrator package. 14358ec469eSopenharmony_ciimport vibrator from '@ohos.vibrator'; 14458ec469eSopenharmony_ciexport default { 14558ec469eSopenharmony_ci onCreate() { 14658ec469eSopenharmony_ci console.info('MiscdeviceJsAPI AceApplication onCreate'); 14758ec469eSopenharmony_ci // Step 2 Trigger vibration with a specific duration. 14858ec469eSopenharmony_ci try { 14958ec469eSopenharmony_ci vibrator.startVibration({ 15058ec469eSopenharmony_ci type: 'time', 15158ec469eSopenharmony_ci duration: 1000, 15258ec469eSopenharmony_ci }, { 15358ec469eSopenharmony_ci id: 0, 15458ec469eSopenharmony_ci usage: 'alarm' 15558ec469eSopenharmony_ci }, (error) => { 15658ec469eSopenharmony_ci if (error) { 15758ec469eSopenharmony_ci console.error('vibrate fail, error.code: ' + error.code + 'error.message: ', + error.message); 15858ec469eSopenharmony_ci return; 15958ec469eSopenharmony_ci } 16058ec469eSopenharmony_ci console.log('Callback returned to indicate a successful vibration.'); 16158ec469eSopenharmony_ci }); 16258ec469eSopenharmony_ci } catch (error) { 16358ec469eSopenharmony_ci console.error('errCode: ' + error.code + ' ,msg: ' + error.message); 16458ec469eSopenharmony_ci } 16558ec469eSopenharmony_ci // Step 3 Stop vibration that is triggered with a specific duration. 16658ec469eSopenharmony_ci try { 16758ec469eSopenharmony_ci vibrator.stopVibration("time").then(() => { 16858ec469eSopenharmony_ci console.log("stopVibration success"); 16958ec469eSopenharmony_ci }, (error)=>{ 17058ec469eSopenharmony_ci console.log("stopVibration error:" + JSON.stringify(error)); 17158ec469eSopenharmony_ci }); 17258ec469eSopenharmony_ci } catch (error) { 17358ec469eSopenharmony_ci console.error('Exception in, error:' + JSON.stringify(error)); 17458ec469eSopenharmony_ci } 17558ec469eSopenharmony_ci // Step 4 Trigger vibration based on with a specific effect. 17658ec469eSopenharmony_ci try { 17758ec469eSopenharmony_ci vibrator.startVibration({ 17858ec469eSopenharmony_ci type: 'preset', 17958ec469eSopenharmony_ci effectId: 'haptic.clock.timer', 18058ec469eSopenharmony_ci count: 1, 18158ec469eSopenharmony_ci }, { 18258ec469eSopenharmony_ci usage: 'unknown' 18358ec469eSopenharmony_ci }).then(()=>{ 18458ec469eSopenharmony_ci console.log('Promise returned to indicate a successful vibration'); 18558ec469eSopenharmony_ci }).catch((error)=>{ 18658ec469eSopenharmony_ci console.error('Promise returned to indicate a failed vibration:' + JSON.stringify(error)); 18758ec469eSopenharmony_ci }); 18858ec469eSopenharmony_ci } catch (error) { 18958ec469eSopenharmony_ci console.error('exception in, error:' + JSON.stringify(error)); 19058ec469eSopenharmony_ci } 19158ec469eSopenharmony_ci // Step 5 Stop vibration that is triggered with a specific effect. 19258ec469eSopenharmony_ci try { 19358ec469eSopenharmony_ci vibrator.stopVibration("preset").then(() => { 19458ec469eSopenharmony_ci console.log("stopVibration success"); 19558ec469eSopenharmony_ci }, (error)=>{ 19658ec469eSopenharmony_ci console.log("stopVibration error:" + JSON.stringify(error)); 19758ec469eSopenharmony_ci }); 19858ec469eSopenharmony_ci } catch (error) { 19958ec469eSopenharmony_ci console.error('Exception in, error:' + JSON.stringify(error)); 20058ec469eSopenharmony_ci } 20158ec469eSopenharmony_ci // Step 6 Query whether 'haptic. lock. timer' is supported. If so, vibrate the effectId. 20258ec469eSopenharmony_ci try { 20358ec469eSopenharmony_ci vibrator.isSupportEffect('haptic.clock.timer', function (err, state) { 20458ec469eSopenharmony_ci if (err) { 20558ec469eSopenharmony_ci console.error('isSupportEffect failed, error:' + JSON.stringify(err)); 20658ec469eSopenharmony_ci return; 20758ec469eSopenharmony_ci } 20858ec469eSopenharmony_ci console.log('The effectId is ' + (state ? 'supported' : 'unsupported')); 20958ec469eSopenharmony_ci if (state) { 21058ec469eSopenharmony_ci try { 21158ec469eSopenharmony_ci vibrator.startVibration({ 21258ec469eSopenharmony_ci type: 'preset', 21358ec469eSopenharmony_ci effectId: 'haptic.clock.timer', 21458ec469eSopenharmony_ci count: 1, 21558ec469eSopenharmony_ci }, { 21658ec469eSopenharmony_ci usage: 'unknown' 21758ec469eSopenharmony_ci }, (error) => { 21858ec469eSopenharmony_ci if(error) { 21958ec469eSopenharmony_ci console.error('haptic.clock.timer vibrator error:' + JSON.stringify(error)); 22058ec469eSopenharmony_ci } else { 22158ec469eSopenharmony_ci console.log('haptic.clock.timer vibrator success'); 22258ec469eSopenharmony_ci } 22358ec469eSopenharmony_ci }); 22458ec469eSopenharmony_ci } catch (error) { 22558ec469eSopenharmony_ci console.error('Exception in, error:' + JSON.stringify(error)); 22658ec469eSopenharmony_ci } 22758ec469eSopenharmony_ci } 22858ec469eSopenharmony_ci }) 22958ec469eSopenharmony_ci } catch (error) { 23058ec469eSopenharmony_ci console.error('Exception in, error:' + JSON.stringify(error)); 23158ec469eSopenharmony_ci } 23258ec469eSopenharmony_ci // Step 7 Stop all types of vibration. 23358ec469eSopenharmony_ci try { 23458ec469eSopenharmony_ci vibrator.stopVibration(function (error) { 23558ec469eSopenharmony_ci if (error) { 23658ec469eSopenharmony_ci console.log('error.code' + error.code + 'error.message' + error.message); 23758ec469eSopenharmony_ci return; 23858ec469eSopenharmony_ci } 23958ec469eSopenharmony_ci console.log('Callback returned to indicate successful.'); 24058ec469eSopenharmony_ci }) 24158ec469eSopenharmony_ci } catch (error) { 24258ec469eSopenharmony_ci console.info('errCode: ' + error.code + ' ,msg: ' + error.message); 24358ec469eSopenharmony_ci } 24458ec469eSopenharmony_ci } 24558ec469eSopenharmony_ci onDestroy() { 24658ec469eSopenharmony_ci console.info('AceApplication onDestroy'); 24758ec469eSopenharmony_ci } 24858ec469eSopenharmony_ci} 24958ec469eSopenharmony_ci``` 25058ec469eSopenharmony_ci 25158ec469eSopenharmony_ci## Repositories Involved<a name="section96071132185310"></a> 25258ec469eSopenharmony_ci 25358ec469eSopenharmony_ciPan-sensor subsystem 25458ec469eSopenharmony_ci 25558ec469eSopenharmony_ci[sensors\_sensor](https://gitee.com/openharmony/sensors_sensor) 25658ec469eSopenharmony_ci 25758ec469eSopenharmony_ci**sensors\_miscdevice**