1895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*
2895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall $License:
3895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall   Copyright 2011 InvenSense, Inc.
4895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
5895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Licensed under the Apache License, Version 2.0 (the "License");
6895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall you may not use this file except in compliance with the License.
7895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall You may obtain a copy of the License at
8895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
9895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall http://www.apache.org/licenses/LICENSE-2.0
10895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
11895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Unless required by applicable law or agreed to in writing, software
12895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall distributed under the License is distributed on an "AS IS" BASIS,
13895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall See the License for the specific language governing permissions and
15895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall limitations under the License.
16895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall  $
17895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
18895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*******************************************************************************
19895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
20895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * $Id: pressure.c 4120 2010-11-21 19:56:16Z mcaramello $
21895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
22895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *******************************************************************************/
23895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
24895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
25895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @defgroup PRESSUREDL
26895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  Motion Library - Pressure Driver Layer.
27895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Provides the interface to setup and handle a pressure sensor
28895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          connected to either the primary or the seconday I2C interface
29895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the gyroscope.
30895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
31895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @{
32895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @file   pressure.c
33895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @brief  Pressure setup and handling methods.
34895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall**/
35895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
36895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* ------------------ */
37895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* - Include Files. - */
38895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* ------------------ */
39895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
40895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <string.h>
41895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
42895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "pressure.h"
43895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
44895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "ml.h"
45895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlinclude.h"
46895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "dmpKey.h"
47895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlFIFO.h"
48895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mldl.h"
49895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mldl_cfg.h"
50895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlMathFunc.h"
51895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlsl.h"
52895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlos.h"
53895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
54895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "log.h"
55895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#undef MPL_LOG_TAG
56895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MPL_LOG_TAG "MPL-pressure"
57895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
58895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define _pressureDebug(x)       //{x}
59895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
60895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* --------------------- */
61895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* - Global Variables. - */
62895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* --------------------- */
63895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
64895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* --------------------- */
65895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* - Static Variables. - */
66895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* --------------------- */
67895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
68895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* --------------- */
69895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* - Prototypes. - */
70895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* --------------- */
71895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
72895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* -------------- */
73895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* - Externs.   - */
74895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* -------------- */
75895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
76895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* -------------- */
77895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* - Functions. - */
78895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* -------------- */
79895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
80895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
81895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  Is a pressure configured and used by MPL?
82895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the pressure is present.
83895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
84895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallunsigned char inv_pressure_present(void)
85895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
86895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
87895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
88895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL != mldl_cfg->pressure &&
89895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        NULL != mldl_cfg->pressure->resume &&
90895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        mldl_cfg->requested_sensors & INV_THREE_AXIS_PRESSURE)
91895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return TRUE;
92895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    else
93895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return FALSE;
94895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
95895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
96895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
97895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief   Query the pressure slave address.
98895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return  The 7-bit pressure slave address.
99895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
100895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallunsigned char inv_get_pressure_slave_addr(void)
101895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
102895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
103895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
104895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL != mldl_cfg->pdata)
105895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return mldl_cfg->pdata->pressure.address;
106895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    else
107895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return 0;
108895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
109895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
110895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
111895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief   Get the ID of the pressure in use.
112895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return  ID of the pressure in use.
113895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
114895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallunsigned short inv_get_pressure_id(void)
115895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
116895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
117895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
118895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL != mldl_cfg->pressure) {
119895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return mldl_cfg->pressure->id;
120895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
121895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return ID_INVALID;
122895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
123895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
124895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
125895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  Get a sample of pressure data from the device.
126895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
127895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              the buffer to store the pressure raw data for
128895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              X, Y, and Z axes.
129895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS or a non-zero error code.
130895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
131895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_pressure_data(long *data)
132895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
133895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
134895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    unsigned char tmp[3];
135895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
136895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
137895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*--- read the pressure sensor data.
138895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall          The pressure read function may return an INV_ERROR_PRESSURE_* errors
139895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall          when the data is not ready (read/refresh frequency mismatch) or
140895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall          the internal data sampling timing of the device was not respected.
141895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall          Returning the error code will make the sensor fusion supervisor
142895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall          ignore this pressure data sample. ---*/
143895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = (inv_error_t) inv_mpu_read_pressure(mldl_cfg,
144895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                                 inv_get_serial_handle(),
145895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                                 inv_get_serial_handle(), tmp);
146895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
147895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        _pressureDebug(MPL_LOGV
148895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                       ("inv_mpu_read_pressure returned %d (%s)\n", result,
149895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                        MLErrorCode(result)));
150895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
151895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
152895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (EXT_SLAVE_BIG_ENDIAN == mldl_cfg->pressure->endian)
153895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] =
154895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            (((long)((signed char)tmp[0])) << 16) + (((long)tmp[1]) << 8) +
155895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            ((long)tmp[2]);
156895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    else
157895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] =
158895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            (((long)((signed char)tmp[2])) << 16) + (((long)tmp[1]) << 8) +
159895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            ((long)tmp[0]);
160895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
161895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_SUCCESS;
162895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
163895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
164895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
165895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @}
166895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
167