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![](figures/en-us_image_0000001152988366.png)
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&lt;void&gt;)</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&lt;void&gt;</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&lt;void&gt;)</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&lt;void&gt;</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&lt;void&gt;)</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&lt;void&gt;</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&lt;boolean&gt;)</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&lt;boolean&gt;</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**