
# 开发指导
#### 使用场景
Huawei LiteOS传感框架非常灵活方便，可以运用在多种终端设备中，例如穿戴设备、智能家居设备、家用医疗设备等。
#### 功能
Sensor Manager提供以下功能。
表1Sensor Manager的功能接口 
| 功能分类     | 接口名                  | 描述                                  |
|:---|:---|:---|
| 传感器管理初始化 | SensorManagerInit    | 创建Sensor Manager任务、队列、信号量等传感器管理所需资源 |
| 传感器注册    | SensorRegister       | 注册对应标签传感器对象                         |
| 传感器配置    | SensorConfigNotify   | 通知Sensor Manager配置传感器参数             |
| 传感器采样    | SensorSample         | 传感器数据采样                             |
| 获取传感器列表  | SensorTableGet       | 获取传感器列表                             |
| 传感器应用    | SensorItemInit       | 初始化对应标签传感器应用，注册应用数据更新回调             |
| 传感器应用    | SensorItemEnable     | 打开传感器应用                             |
| 传感器应用    | SensorItemDisable    | 关闭传感器应用                             |
| 传感器消息    | SensorMessageProcess | 处理从外部模块发来的传感器消息                     |
| 传感器消息    | SensorCommuSend      | 发送传感器消息到外部模块，由实际应用实现相关代码            |
   
#### 数据结构
SensorType结构体：
```
typedef struct {
    struct LOS_DL_LIST      list;
    struct LOS_DL_LIST      slist;         // 相同类别标签的应用会挂在该链表下面
    struct LOS_DL_LIST      attachedApp;
    struct DeviceType       *attachDevice;
    struct LOS_DL_LIST      slaveList;
    struct SensorOperation  *sensorOp;     // Init、Open、Close、IoCtl等操作
    OpenParam               openParam;
    CloseParam              closeParam;
    VOID                    *sensorData;   // 采样数据指针
    UINT32                  slaveAddr;
    UINT32                  interval;      // 软件定时器间隔，单位是tick
    INT32                   count;
    UINT32                  sensorMuxLock; // 多个应用操作时需获取sensor锁，避免冲突
    VOID                    *priv;         // 私有变量指针
    PrivResponse            privResp;
    SensorItem              commuItem;
    UINT8                   sensorDataLen; // 采样数据长度
    UINT8                   tag;           // 类别标签
    UINT8                   cmd;
    UINT8                   sensorStat;
} SensorType;
```
SensorItem结构体：
```
typedef struct {
    struct LOS_DL_LIST list;
    OpenParam          openParam;   // 打开参数
    CloseParam         closeParam;  // 关闭参数
    RespFunc           respFunc;    // 应答回调
    UpdateFunc         updateFunc;  // 数据更新回调
    UINT32             updateArg;   // 数据更新回调入参
    UINT32             updateTime;  // 数据更新时间，即应用采集周期
    UINT32             updateCnt;
    ObjTag             tag;
    SensorItemState    state;       // 应用状态
    UINT16             id;          // 应用Id
    UINT8              resp;        // 0 不回复, 1 回复
    UINT8              reserverd;
} SensorItem;
```
#### 开发流程
使用Sensor Manager管理某一类别传感器典型流程如下：
1. 通过make menuconfig配置传感框架，菜单路径为：Components ---\> Sensorhub。
   
   | 配置项                         | 含义        | 取值范围   | 默认值 | 依赖 |
   |:---|:---|:---|:---|:---|
   | LOSCFG_COMPONENTS_SENSORHUB | 传感框架的裁剪开关 | YES/NO | NO  | 无  |
      
   
2. 创建任务、队列、信号量等资源SensorManagerInit。

3. 初始化SensorType结构体变量，并注册传感器SensorRegister。

4. 通过SensorTableGet获取传感器列表，执行已注册传感器的初始化动作。
5. 根据需要配置传感器参数SensorConfigNotify。
6. 初始化相同类别标签的传感器应用SensorItemInit，并提供应用Id和数据更新回调函数。
7. 打开传感器应用SensorItemEnable，并提供应用采样周期，传感器驱动会根据打开参数的时间间隔创建软件定时器并启动，定时时间到达后则调用SensorSample通知Sensor Manager 读取数据，同时根据采样周期设置推送数据到该应用注册的回调函数。
8. 关闭传感器应用SensorItemDisable，停止推送数据到该应用。
传感器消息处理、发送根据具体业务需求增加。
