
# 编程实例
#### 实例描述
基于野火挑战者开发板（Cloud_STM32F429IGTx_FIRE）开发应用定时读取MPU6050传感器的原始数据。MPU6050是一种六轴传感器模块，能同时检测三轴加速度、三轴陀螺仪（角加速度）、温度。本实例中提供的传感器驱动和应用代码仅对使用传感框架读取传感器做基本设计和实现，仅做参考。
1. 初始化陀螺仪标签类别的两个应用g_gyroItem1、g_gyroItem2。
2. 设置不同的采集周期，打开应用，注册数据更新回调函数SensorReport。
3. 采集一段时间后，先关闭g_gyroItem1，此时传感器数据会继续推送g_gyroItem2，一段时间后，关闭g_gyroItem2，此时传感器数据采样停止，SensorReport不再被调用。
4. 再执行一遍2、3步骤。
#### 实例代码
```
#define STASK_PRIORITY_MISC   4
#define STASK_STKDEPTH_MISC   0x800
#define Item1_SAMPLE_INTERVAL 3000 // LiteOS ticks
#define Item2_SAMPLE_INTERVAL 6000
STATIC SensorItem g_gyroItem1 = {
    .id = 1, // 1: gyro item 1
};
STATIC SensorItem g_gyroItem2 = {
    .id = 2, // 2: gyro item 2
};
STATIC UINT32 g_miscTskID;
STATIC INT32 SensorReport(UINT32 arg, const INT8 *data, UINT32 len)
{
    (VOID)(len);
    (VOID)(data);
    PRINTK("tag %u report\r\n", arg);
    return LOS_OK;
}
STATIC VOID OpenGyro(VOID)
{
    OpenParam para;
    // period is LiteOS ticks
    para.period = Item1_SAMPLE_INTERVAL;
    SensorItemEnable(&g_gyroItem1, &para, g_gyroItem1.id, 0);
    para.period = Item2_SAMPLE_INTERVAL;
    SensorItemEnable(&g_gyroItem2, &para, g_gyroItem2.id, 0);
}
STATIC VOID CloseGyro(VOID)
{
    CloseParam para;
    SensorItemDisable(&g_gyroItem1, &para, g_gyroItem1.id, 0);
    // keep item2 working for 40000 ticks
    LOS_TaskDelay(40000);
    SensorItemDisable(&g_gyroItem2, &para, g_gyroItem2.id, 0);
}
STATIC VOID InitGyro(VOID)
{
    SensorType *sensor = NULL;
    SensorScbTable *scbTable = NULL;
    // init gyro sensor
    scbTable = SensorTableGet();
    sensor = scbTable[TAG_GYRO - TAG_BEGIN].sensorInterface;
    if ((sensor != NULL) && (sensor->sensorOp != NULL)) {
        (VOID)sensor->sensorOp->Init(sensor);
    }
    // init item
    SensorItemInit(&g_gyroItem1, NULL, TAG_GYRO, SensorReport, TAG_GYRO);
    SensorItemInit(&g_gyroItem2, NULL, TAG_GYRO, SensorReport, TAG_GYRO);
}
STATIC VOID MiscTask(VOID const *arg)
{
    (VOID)(arg);
    // I2C init
    I2cMaster_Init();
    SensorManagerInit();
    LOS_TaskDelay(1000);
    GyroSensorRegister();
    InitGyro();
    OpenGyro();
    LOS_TaskDelay(20000);
    CloseGyro();
    OpenGyro();
    LOS_TaskDelay(100000);
    CloseGyro();
}
VOID MiscInit(VOID)
{
    UINT32 ret;
    TSK_INIT_PARAM_S taskInitParam = {0};
    taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)MiscTask;
    taskInitParam.uwStackSize  = STASK_STKDEPTH_MISC;
    taskInitParam.pcName       = "Misc Task";
    taskInitParam.usTaskPrio   = STASK_PRIORITY_MISC; /* 1~7 */
    taskInitParam.uwResved     = LOS_TASK_STATUS_DETACHED; /* task is detached, the task can deleteself */
    ret = LOS_TaskCreate(&g_miscTskID, &taskInitParam);
    if (ret != LOS_OK) {
        PRINT_ERR("Misc Task create fail\n");
        return;
    }
    PRINT_DEBUG("MiscTask init \n");
}
```
#### 结果验证
第一次数据采样会推送至所有相关应用，后面按照应用周期推送数据。运行得到的结果为：
```
Get mpu6050 id = 104
gyro on.
read data
Acc:       642       0   16586
Gyro:      -12       0      -9
temp:       31
tag 2 report
tag 2 report
read data
Acc:       662       8   16594
Gyro:      -12       0      -9
temp:       31
tag 2 report
tag 2 report
read data
Acc:       652     -14   16566
Gyro:      -12       0      -9
temp:       31
tag 2 report
read data
Acc:       642     -12   16598
Gyro:      -12       0      -9
temp:       31
tag 2 report
tag 2 report
read data
Acc:       642       4   16586
Gyro:      -12       0      -9
temp:       31
tag 2 report
read data
Acc:       640     -18   16596
Gyro:      -12      -1      -9
temp:       31
tag 2 report
……
```
#### 完整实例代码
传感器驱动：[gyro.c](https://support.huaweicloud.com/component-LiteOS/resource/gyro.c)
应用实例：[sensorhub_demo.c](https://support.huaweicloud.com/component-LiteOS/resource/sensorhub_demo.c)
