1# sensor<a name="ZH-CN_TOPIC_0000001078202098"></a> 2 3- [简介](#section11660541593) 4- [目录](#section161941989596) 5- [说明](#section45490312053) 6 - [接口说明](#section14840627279) 7 - [使用说明](#section460510231888) 8 9- [相关仓](#section12495154795416) 10 11## 简介<a name="section11660541593"></a> 12 13Sensor驱动模型主要包含Sensor(传感器)相关HDI接口与实现,提供Sensor HDI(**H**ardware **D**river **I**nterface)能力接口,主要包括所有Sensor信息查询、Sensor启停、Sensor订阅/去订阅、Sensor参数配置等稳定的接口,简化服务开发。 14 15**图 1** Sensor驱动模块架构图<a name="fig1292918466322"></a> 16 17 18## 目录<a name="section161941989596"></a> 19 20Sensor驱动下源代码目录结构如下所示: 21 22``` 23/drivers/peripheral/sensor 24├── hal # sensor模块hal层代码 25│ └── include # sensor模块hal层内部头文件 26│ └── src # sensor模块hal层代码的实现 27├── interfaces # sensor模块对上层服务提供的驱动能力接口 28│ └── include # sensor模块对外提供的接口定义 29├── test # sensor模块测试代码 30│ └── unittest # sensor模块单元测试代码 31``` 32 33## 说明<a name="section45490312053"></a> 34 35本节以订阅加速度传感器数据为例进行介绍。 36 37### 接口说明<a name="section14840627279"></a> 38 39Sensor驱动HAL模块提供给Sensor服务可直接调用的能力接口,主要功能有:查询,配置,数据订阅等操作。Sensor驱动模型对HDI开放的API接口功能如表1: 40 41**表 1** Sensor HDI 接口列表 42 43<a name="table132511511499"></a> 44<table><thead align="left"><tr id="row22545164911"><th class="cellrowborder" valign="top" width="9.85098509850985%" id="mcps1.2.4.1.1"><p id="p17401913133218"><a name="p17401913133218"></a><a name="p17401913133218"></a>功能分类</p> 45</th> 46<th class="cellrowborder" valign="top" width="53.88538853885388%" id="mcps1.2.4.1.2"><p id="p20921103144918"><a name="p20921103144918"></a><a name="p20921103144918"></a>接口名</p> 47</th> 48<th class="cellrowborder" valign="top" width="36.26362636263626%" id="mcps1.2.4.1.3"><p id="p109216317495"><a name="p109216317495"></a><a name="p109216317495"></a>功能描述</p> 49</th> 50</tr> 51</thead> 52<tbody><tr id="row9256564919"><td class="cellrowborder" valign="top" width="9.85098509850985%" headers="mcps1.2.4.1.1 "><p id="p8437193673211"><a name="p8437193673211"></a><a name="p8437193673211"></a>查询操作</p> 53</td> 54<td class="cellrowborder" valign="top" width="53.88538853885388%" headers="mcps1.2.4.1.2 "><p id="p11001322173912"><a name="p11001322173912"></a><a name="p11001322173912"></a>int32_t <strong id="b935414557240"><a name="b935414557240"></a><a name="b935414557240"></a>GetAllSensors</strong>(struct SensorInformation **sensorInfo, int32_t *count)</p> 55</td> 56<td class="cellrowborder" valign="top" width="36.26362636263626%" headers="mcps1.2.4.1.3 "><p id="p199227318499"><a name="p199227318499"></a><a name="p199227318499"></a>获取系统中注册的所有传感器信息,一种类型传感器信息包括传感器名字、设备厂商、固件版本号、硬件版本号、传感器类型编号、传感器标识、最大量程、精度、功耗。</p> 57</td> 58</tr> 59<tr id="row1026352493"><td class="cellrowborder" rowspan="5" valign="top" width="9.85098509850985%" headers="mcps1.2.4.1.1 "><p id="p06071477324"><a name="p06071477324"></a><a name="p06071477324"></a>配置操作</p> 60</td> 61<td class="cellrowborder" valign="top" width="53.88538853885388%" headers="mcps1.2.4.1.2 "><p id="p38874252376"><a name="p38874252376"></a><a name="p38874252376"></a>int32_t <strong id="b199602219271"><a name="b199602219271"></a><a name="b199602219271"></a>Enable</strong>(int32_t sensorId)</p> 62</td> 63<td class="cellrowborder" valign="top" width="36.26362636263626%" headers="mcps1.2.4.1.3 "><p id="p5922331114916"><a name="p5922331114916"></a><a name="p5922331114916"></a>使能一种传感器设备,只有数据订阅者使能传感器后,才能获取订阅的传感器数据。</p> 64</td> 65</tr> 66<tr id="row42612518492"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p6923143184914"><a name="p6923143184914"></a><a name="p6923143184914"></a>int32_t <strong id="b84601875330"><a name="b84601875330"></a><a name="b84601875330"></a>Disable</strong>(int32_t sensorId)</p> 67</td> 68<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p139231531184912"><a name="p139231531184912"></a><a name="p139231531184912"></a>去使能一种传感器设备。</p> 69</td> 70</tr> 71<tr id="row14261659498"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p992473112496"><a name="p992473112496"></a><a name="p992473112496"></a>int32_t <strong id="b16691194511438"><a name="b16691194511438"></a><a name="b16691194511438"></a>SetBatch</strong>(iint32_t sensorId, int64_t samplingInterval, int64_t reportInterval)</p> 72</td> 73<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p14924203134910"><a name="p14924203134910"></a><a name="p14924203134910"></a>设置一种传感器的数据采样间隔和数据上报间隔。</p> 74</td> 75</tr> 76<tr id="row82615144912"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p170411511281"><a name="p170411511281"></a><a name="p170411511281"></a>int32_t <strong id="b170414153284"><a name="b170414153284"></a><a name="b170414153284"></a>SetMode</strong>(int32_t sensorTypeId, SensorUser *user, int32_t mode)</p> 77</td> 78<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p107051159281"><a name="p107051159281"></a><a name="p107051159281"></a>设置一种传感器的工作模式,不同的工作模式,上报数据方式不同。</p> 79</td> 80</tr> 81<tr id="row7260574918"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p492513120494"><a name="p492513120494"></a><a name="p492513120494"></a>int32_t <strong id="b7501191019330"><a name="b7501191019330"></a><a name="b7501191019330"></a>SetOption</strong>(int32_t sensorId, uint32_t option)</p> 82</td> 83<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p5926031124914"><a name="p5926031124914"></a><a name="p5926031124914"></a>设置一种传感器量程,精度等可选配置。</p> 84</td> 85</tr> 86<tr id="row5261957493"><td class="cellrowborder" rowspan="2" valign="top" width="9.85098509850985%" headers="mcps1.2.4.1.1 "><p id="p1039815743211"><a name="p1039815743211"></a><a name="p1039815743211"></a>数据订阅操作</p> 87</td> 88<td class="cellrowborder" valign="top" width="53.88538853885388%" headers="mcps1.2.4.1.2 "><p id="p11530101054411"><a name="p11530101054411"></a><a name="p11530101054411"></a>int32_t <strong id="b0569161217334"><a name="b0569161217334"></a><a name="b0569161217334"></a>Register</strong>(RecordDataCallback cb)</p> 89</td> 90<td class="cellrowborder" valign="top" width="36.26362636263626%" headers="mcps1.2.4.1.3 "><p id="p892633118493"><a name="p892633118493"></a><a name="p892633118493"></a>订阅者注册传感器数据回调函数,系统会将获取到的传感器数据上报给订阅者。</p> 91</td> 92</tr> 93<tr id="row10900102644918"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p196491214133110"><a name="p196491214133110"></a><a name="p196491214133110"></a>int32_t <strong id="b13758151483317"><a name="b13758151483317"></a><a name="b13758151483317"></a>Unregister</strong>(void)</p> 94</td> 95<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p5817133119"><a name="p5817133119"></a><a name="p5817133119"></a>订阅者去注册传感器数据回调函数。</p> 96</td> 97</tr> 98<tr id="row0353356768"><td class="cellrowborder" rowspan="2" valign="top" width="9.85098509850985%" headers="mcps1.2.4.1.1 "><p id="p6596162112564"><a name="p6596162112564"></a><a name="p6596162112564"></a>接口实例</p> 99</td> 100<td class="cellrowborder" valign="top" width="53.88538853885388%" headers="mcps1.2.4.1.2 "><p id="p13679191616561"><a name="p13679191616561"></a><a name="p13679191616561"></a>const struct SensorInterface *<strong id="b334310134717"><a name="b334310134717"></a><a name="b334310134717"></a>NewSensorInterfaceInstance</strong>(void)</p> 101</td> 102<td class="cellrowborder" valign="top" width="36.26362636263626%" headers="mcps1.2.4.1.3 "><p id="p19679181612563"><a name="p19679181612563"></a><a name="p19679181612563"></a>创建传感器接口实例。</p> 103</td> 104</tr> 105<tr id="row53542561265"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p15680111655611"><a name="p15680111655611"></a><a name="p15680111655611"></a>int32_t <strong id="b99024181871"><a name="b99024181871"></a><a name="b99024181871"></a>FreeSensorInterfaceInstance</strong>(void)</p> 106</td> 107<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p18680916165620"><a name="p18680916165620"></a><a name="p18680916165620"></a>释放传感器接口实例。</p> 108</td> 109</tr> 110</tbody> 111</table> 112 113### 使用说明<a name="section460510231888"></a> 114 115代码示例 116 117``` 118#include "sensor_if.h" 119#include "sensor_type.h" 120 121/* 创建回调函数 */ 122void SensorDataCallback(struct SensorEvents *event) 123{ 124 if(event == NULL){ 125 return; 126 } 127 float *sensorData=(float *)event->data; 128 printf("sensor data[%f]", *sensorData); 129} 130 131void SensorSample(void) 132{ 133 int ret; 134 struct SensorInformation *sensorInfo = NULL; 135 int32_t count = 0; 136 int32_t sensorInterval = 200000000; /* 数据采样率设置200毫秒,单位纳秒 */ 137 138 /* 1.创建传感器接口实例 */ 139 const struct SensorInterface *sensorDev = NewSensorInterfaceInstance(); 140 if (sensorDev == NULL) { 141 return; 142 } 143 /* 2.订阅者注册传感器数据回调处理函数 */ 144 ret = sensorDev->Register(0, SensorDataCallback); 145 if (ret != 0) { 146 return; 147 } 148 /* 3.获取设备支持的Sensor列表 */ 149 ret = sensorDev->GetAllSensors(&sensorInfo, &count); 150 if (ret != 0) { 151 return; 152 } 153 /* 4.设置传感器采样率 */ 154 ret = sensorDev->SetBatch(SENSOR_TYPE_ACCELEROMETER, sensorInterval, 0); 155 if (ret != 0) { 156 return; 157 } 158 /* 5.使能传感器 */ 159 ret = sensorDev->Enable(SENSOR_TYPE_ACCELEROMETER); 160 if (ret != 0) { 161 return; 162 } 163 /* 6.去使能传感器 */ 164 ret = sensorDev->Disable(SENSOR_TYPE_ACCELEROMETER); 165 if (ret != 0) { 166 return; 167 } 168 /* 7.取消传感器数据订阅函数 */ 169 ret = sensorDev->Unregister(0); 170 if (ret != 0) { 171 return; 172 } 173 /* 8.释放传感器接口实例 */ 174 ret = FreeSensorInterfaceInstance(); 175 if (ret != 0) { 176 return; 177 } 178} 179``` 180 181## 相关仓<a name="section12495154795416"></a> 182 183[驱动子系统](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) 184 185[drivers\_framework](https://gitee.com/openharmony/drivers_framework/blob/master/README_zh.md) 186 187[drivers\_adapter](https://gitee.com/openharmony/drivers_adapter/blob/master/README_zh.md) 188 189[drivers\_adapter\_khdf\_linux](https://gitee.com/openharmony/drivers_adapter_khdf_linux/blob/master/README_zh.md) 190 191[drivers\_peripheral](https://gitee.com/openharmony/drivers_peripheral) 192 193