166 lines
4.5 KiB
C
166 lines
4.5 KiB
C
/*
|
|
$License:
|
|
Copyright 2011 InvenSense, Inc.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
$
|
|
*/
|
|
/*******************************************************************************
|
|
*
|
|
* $Id: pressure.c 4120 2010-11-21 19:56:16Z mcaramello $
|
|
*
|
|
*******************************************************************************/
|
|
|
|
/**
|
|
* @defgroup PRESSUREDL
|
|
* @brief Motion Library - Pressure Driver Layer.
|
|
* Provides the interface to setup and handle a pressure sensor
|
|
* connected to either the primary or the seconday I2C interface
|
|
* of the gyroscope.
|
|
*
|
|
* @{
|
|
* @file pressure.c
|
|
* @brief Pressure setup and handling methods.
|
|
**/
|
|
|
|
/* ------------------ */
|
|
/* - Include Files. - */
|
|
/* ------------------ */
|
|
|
|
#include <string.h>
|
|
|
|
#include "pressure.h"
|
|
|
|
#include "ml.h"
|
|
#include "mlinclude.h"
|
|
#include "dmpKey.h"
|
|
#include "mlFIFO.h"
|
|
#include "mldl.h"
|
|
#include "mldl_cfg.h"
|
|
#include "mlMathFunc.h"
|
|
#include "mlsl.h"
|
|
#include "mlos.h"
|
|
|
|
#include "log.h"
|
|
#undef MPL_LOG_TAG
|
|
#define MPL_LOG_TAG "MPL-pressure"
|
|
|
|
#define _pressureDebug(x) //{x}
|
|
|
|
/* --------------------- */
|
|
/* - Global Variables. - */
|
|
/* --------------------- */
|
|
|
|
/* --------------------- */
|
|
/* - Static Variables. - */
|
|
/* --------------------- */
|
|
|
|
/* --------------- */
|
|
/* - Prototypes. - */
|
|
/* --------------- */
|
|
|
|
/* -------------- */
|
|
/* - Externs. - */
|
|
/* -------------- */
|
|
|
|
/* -------------- */
|
|
/* - Functions. - */
|
|
/* -------------- */
|
|
|
|
/**
|
|
* @brief Is a pressure configured and used by MPL?
|
|
* @return INV_SUCCESS if the pressure is present.
|
|
*/
|
|
unsigned char inv_pressure_present(void)
|
|
{
|
|
INVENSENSE_FUNC_START;
|
|
struct mldl_cfg *mldl_cfg = inv_get_dl_config();
|
|
if (NULL != mldl_cfg->pressure &&
|
|
NULL != mldl_cfg->pressure->resume &&
|
|
mldl_cfg->requested_sensors & INV_THREE_AXIS_PRESSURE)
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* @brief Query the pressure slave address.
|
|
* @return The 7-bit pressure slave address.
|
|
*/
|
|
unsigned char inv_get_pressure_slave_addr(void)
|
|
{
|
|
INVENSENSE_FUNC_START;
|
|
struct mldl_cfg *mldl_cfg = inv_get_dl_config();
|
|
if (NULL != mldl_cfg->pdata)
|
|
return mldl_cfg->pdata->pressure.address;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the ID of the pressure in use.
|
|
* @return ID of the pressure in use.
|
|
*/
|
|
unsigned short inv_get_pressure_id(void)
|
|
{
|
|
INVENSENSE_FUNC_START;
|
|
struct mldl_cfg *mldl_cfg = inv_get_dl_config();
|
|
if (NULL != mldl_cfg->pressure) {
|
|
return mldl_cfg->pressure->id;
|
|
}
|
|
return ID_INVALID;
|
|
}
|
|
|
|
/**
|
|
* @brief Get a sample of pressure data from the device.
|
|
* @param data
|
|
* the buffer to store the pressure raw data for
|
|
* X, Y, and Z axes.
|
|
* @return INV_SUCCESS or a non-zero error code.
|
|
*/
|
|
inv_error_t inv_get_pressure_data(long *data)
|
|
{
|
|
inv_error_t result = INV_SUCCESS;
|
|
unsigned char tmp[3];
|
|
struct mldl_cfg *mldl_cfg = inv_get_dl_config();
|
|
|
|
/*--- read the pressure sensor data.
|
|
The pressure read function may return an INV_ERROR_PRESSURE_* errors
|
|
when the data is not ready (read/refresh frequency mismatch) or
|
|
the internal data sampling timing of the device was not respected.
|
|
Returning the error code will make the sensor fusion supervisor
|
|
ignore this pressure data sample. ---*/
|
|
result = (inv_error_t) inv_mpu_read_pressure(mldl_cfg,
|
|
inv_get_serial_handle(),
|
|
inv_get_serial_handle(), tmp);
|
|
if (result) {
|
|
_pressureDebug(MPL_LOGV
|
|
("inv_mpu_read_pressure returned %d (%s)\n", result,
|
|
MLErrorCode(result)));
|
|
return result;
|
|
}
|
|
if (EXT_SLAVE_BIG_ENDIAN == mldl_cfg->pressure->endian)
|
|
data[0] =
|
|
(((long)((signed char)tmp[0])) << 16) + (((long)tmp[1]) << 8) +
|
|
((long)tmp[2]);
|
|
else
|
|
data[0] =
|
|
(((long)((signed char)tmp[2])) << 16) + (((long)tmp[1]) << 8) +
|
|
((long)tmp[0]);
|
|
|
|
return INV_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|