summaryrefslogtreecommitdiff
path: root/peripheral/libupm/src/mpl3115a2/mpl3115a2.h
diff options
context:
space:
mode:
Diffstat (limited to 'peripheral/libupm/src/mpl3115a2/mpl3115a2.h')
-rw-r--r--peripheral/libupm/src/mpl3115a2/mpl3115a2.h256
1 files changed, 256 insertions, 0 deletions
diff --git a/peripheral/libupm/src/mpl3115a2/mpl3115a2.h b/peripheral/libupm/src/mpl3115a2/mpl3115a2.h
new file mode 100644
index 0000000..56ae8fd
--- /dev/null
+++ b/peripheral/libupm/src/mpl3115a2/mpl3115a2.h
@@ -0,0 +1,256 @@
+/*
+ * Author: William Penner <william.penner@intel.com>
+ * Copyright (c) 2014 Intel Corporation.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#pragma once
+
+#include <string>
+#include <mraa/i2c.hpp>
+#include <math.h>
+
+#define MPL3115A2_NAME "mpl3115a2"
+
+#define MPL3115A2_I2C_ADDRESS 0x60
+#define MPL3115A2_DEVICE_ID 0xc4
+
+#define MPL3115A2_STATUS 0x00
+#define MPL3115A2_OUT_PRESS 0x01 /* MSB first, 20 bit */
+#define MPL3115A2_OUT_TEMP 0x04 /* MSB first, 12 bit */
+#define MPL3115A2_WHO_AM_I 0x0c
+#define MPL3115A2_PT_DATA_CFG 0x13
+#define MPL3115A2_P_MIN 0x1C
+#define MPL3115A2_T_MIN 0x1F
+#define MPL3115A2_P_MAX 0x21
+#define MPL3115A2_T_MAX 0x24
+#define MPL3115A2_CTRL_REG1 0x26
+
+// CTRL_REG1
+#define MPL3115A2_CTRL_SBYB 0x01 /* Standby (not) */
+#define MPL3115A2_CTRL_OST 0x02 /* One-shot trigger */
+#define MPL3115A2_CTRL_RESET 0x04 /* RESET device */
+#define MPL3115A2_CTRL_ALT_MODE 0x80 /* Altitude mode */
+
+#define MPL3115A2_SETOVERSAMPLE(a) ((a & 7) << 3)
+#define MPL3115A2_GETOVERSAMPLE(a) ((a >> 3) & 7)
+#define MPL3115A2_MAXOVERSAMPLE 7
+
+namespace upm {
+
+/**
+ * @brief MPL3115A2 Atmospheric Pressure Sensor library
+ * @defgroup mpl3115a2 libupm-mpl3115a2
+ * @ingroup freescale i2c pressure
+ */
+/**
+ * @library mpl3115a2
+ * @sensor mpl3115a2
+ * @comname MPL3115A2 Atmospheric Pressure Sensor
+ * @type pressure
+ * @man freescale
+ * @web http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MPL3115A2
+ * @con i2c
+ *
+ * @brief API for the MPL3115A2 Atmospheric Pressure Sensor
+ *
+ * Freescale Semiconductor* [MPL3115A2]
+ * (http://cache.freescale.com/files/sensors/doc/data_sheet/MPL3115A2.pdf)
+ * is a high-precision, ultra-low power consumption pressure sensor. Its operating
+ * range is 50-110 kPa.
+ *
+ * @image html mpl3115a2.jpg
+ * @snippet mpl3115a2.cxx Interesting
+ */
+class MPL3115A2 {
+ public:
+ /**
+ * Instantiates an MPL3115A2 object
+ *
+ * @param bus Number of the used bus
+ * @param devAddr Address of the used I2C device
+ * @param mode MPL3115A2 oversampling (6 = 64x)
+ */
+ MPL3115A2(int bus, int devAddr=MPL3115A2_I2C_ADDRESS, uint8_t mode=6);
+
+ /**
+ * MPL3115A2 object destructor; basically, it closes the I2C connection.
+ * ~MPL3115A2();
+ * no need for this here, as the I2c connection will be closed when the
+ * m_i2ControlCtx variable will go out of scope
+ **/
+
+ /**
+ * Tests the sensor and tries to determine if the sensor is operating by looking
+ * for small variations in the value
+ */
+ int testSensor(void);
+
+ /**
+ * Performs a soft reset of the MPL3115A2 device to ensure
+ * it is in a known state. This function can be used to reset
+ * the min/max temperature and pressure values.
+ */
+ int resetSensor(void);
+
+ /**
+ * Dumps out the I2C register block to stdout
+ */
+ void dumpSensor(void);
+
+ /**
+ * Initiates a temperature/pressure mesasurement and waits for the function
+ * to complete. Temperature and pressure registers can be read
+ * after this call.
+ */
+ int sampleData(void);
+
+ /**
+ * Reads the pressure value from MPL3115A2 [Pa * 100]
+ *
+ * @param reg Base address of the pressure register
+ */
+ int32_t getPressureReg(int reg);
+
+ /**
+ * Reads the temperature value from MPL3115A2 [degC * 1000]
+ *
+ * @param reg Base address of the temperature register
+ */
+ int32_t getTempReg(int reg);
+
+ /**
+ * Reads the current pressure value from MPL3115A2 [Pa]
+ *
+ * @param bSampleData Sets non-zero to a sample reading
+ */
+ float getPressure(int bSampleData = true);
+
+ /**
+ * Reads the current temperature value from MPL3115A2 [degC]
+ *
+ * @param bSampleData Sets non-zero to a sample reading
+ */
+ float getTemperature(int bSampleData = true);
+
+ /**
+ * Reads the current pressure and, using a known altitude, calculates
+ * the sea level pressure value [Pa]
+ * This function should be preceded by the sampleData() call
+ *
+ * @param altitudeMeters Altitude in meters
+ */
+ float getSealevelPressure(float altitudeMeters = 0.0);
+
+ /**
+ * Reads the current pressure and, using a known sea level pressure,
+ * calculates the altitude value [m]
+ * This function should be preceded by the sampleData() call
+ *
+ * @param sealevelPressure Current sea level pressure
+ */
+ float getAltitude (float sealevelPressure = 101325.0);
+
+ /**
+ * Defines the oversampling setting (ranges from 0 to 7). The
+ * value represents 2^n samples (ranging from 1 to 128). The
+ * time to calculate a sample is approximately (2^n * 4 + 2) ms
+ *
+ * @param oversampling New oversampling value
+ */
+ void setOversampling(uint8_t oversampling);
+
+ /**
+ * Returns the current oversampling value
+ */
+ uint8_t getOversampling(void);
+
+ /**
+ * Reads the maximum measured temperature [degC]
+ */
+ float getTemperatureMax(void);
+
+ /**
+ * Reads the minimum measured temperature [degC]
+ */
+ float getTemperatureMin(void);
+
+ /**
+ * Reads the maximum measured pressure [Pa]
+ */
+ float getPressureMax (void);
+
+ /**
+ * Reads the minimum measured pressure [Pa]
+ */
+ float getPressureMin (void);
+
+ /**
+ * Converts temperature from degC*1000 to degF*1000
+ *
+ * @param iTemp Temperature in degC
+ */
+ float convertTempCtoF(float fTemp);
+
+ /**
+ * Converts pressure from Pa*100 to inHg*10000
+ * This is set for 15degC (Pa = 0.0002961 in Hg)
+ * TODO: Change the function to add temperature calibration
+ *
+ * @param iPressure Pressure in Pa
+ */
+ float convertPaToinHg(float fPressure);
+
+ /**
+ * Writes one byte to an I2C register
+ *
+ * @param reg Address of the register
+ * @param value Byte to be written
+ */
+ mraa::Result i2cWriteReg (uint8_t reg, uint8_t value);
+
+ /**
+ * Reads two bytes from an I2C register
+ *
+ * @param reg Address of the register
+ */
+ uint16_t i2cReadReg_16 (int reg);
+
+ /**
+ * Reads a one-byte register
+ *
+ * @param reg Address of the register
+ */
+ uint8_t i2cReadReg_8 (int reg);
+
+ private:
+ std::string m_name;
+
+ int m_controlAddr;
+ int m_bus;
+ mraa::I2c m_i2ControlCtx;
+
+ uint8_t m_oversampling;
+ int32_t m_iPressure;
+ int32_t m_iTemperature;
+};
+
+}
+