Class module for MPL3115A2 I2C Barometric Sensor
Dependents: mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more
MPL3115A2.h
- Committer:
- Evan Hosseini
- Date:
- 2018-01-31
- Revision:
- 5:8be678fd9e55
- Parent:
- 0:3f52908a334d
File content as of revision 5:8be678fd9e55:
/** * @file MPL3115A2.h * @brief Device driver - MPL3115A2 barometric pressure sensor IC w/RTOS support * @author Tim Barr * @version 1.0 * @see http://cache.freescale.com/files/sensors/doc/data_sheet/MPL3115A2.pdf * * Copyright (c) 2015 * * 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. */ #ifndef MPL3115A2_H #define MPL3115A2_H #include "mbed.h" /** Using the MultiTech Systems MTDOT-EVB * * Example: * @code * #include "mbed.h" * #include "MPL3115A2.h" * * * int main() * { * } * @endcode */ /** * @class MPL3115A2_DATA * @brief API abstraction for the MPL3115A2 barometric pressure IC data */ class MPL3115A2_DATA { public: /*!< volatile data variables */ volatile int32_t _baro; volatile int16_t _temp; volatile int32_t _minbaro; volatile int32_t _maxbaro; volatile int16_t _mintemp; volatile int16_t _maxtemp; /** Create the MPL3115A2_DATA object initialized to the parameter (or 0 if none) * @param baro - the init value of _baro * @param temp - the init value of _temperature * @param minbaro - the init value of _minbaro * @param maxbaro - the init value of _maxbaro * @param mintemp - the init value of _mintemp * @param maxtemp - the init value of _maxtemp */ MPL3115A2_DATA(int32_t baro = 0, int16_t temp = 0, int32_t minbaro = 0, int32_t maxbaro = 0, int16_t mintemp = 0, int16_t maxtemp = 0) : _baro(baro), _temp(temp), _minbaro(minbaro), _maxbaro(maxbaro), _mintemp(mintemp), _maxtemp(maxtemp){} /** Overloaded '=' operator to allow shorthand coding, assigning objects to one another * @param rhs - an object of the same type to assign ourself the same values of * @return this */ MPL3115A2_DATA &operator= (MPL3115A2_DATA const &rhs) { _baro = rhs._baro; _temp = rhs._temp; _minbaro = rhs._minbaro; _maxbaro = rhs._maxbaro; _mintemp = rhs._mintemp; _maxtemp = rhs._maxtemp; return *this; } /** Overloaded '=' operator to allow shorthand coding, assigning objects to one another * @param val - Assign each data member (_pressure, _temperature) this value * @return this MPL3115A2_DATA &operator= (uint16_t val) { _baro = _temp = val; return *this; } */ /** Overloaded '==' operator to allow shorthand coding, test objects to one another * @param rhs - the object to compare against * @return 1 if the data members are the same and 0 otherwise */ bool operator== (MPL3115A2_DATA &rhs) { return ((_baro == rhs._baro)&&(_temp == rhs._temp)&& (_minbaro == rhs._minbaro) && (_maxbaro == rhs._maxbaro)&& (_mintemp == rhs._mintemp) && (_maxtemp == rhs._maxtemp)) ? 1 : 0; } }; /** * @class MPL3115A2 * @brief API abstraction for the MPL3115A2 3-axis barometric sensor IC * initial version will be polling only. Interrupt service and rtos support will * be added at a later point */ class MPL3115A2 { public: /** * @enum WHO_AM_I_VAL * @brief Device ID's that this class is compatible with */ enum WHO_AM_I_VAL { I_AM_MPL3115A2 = 0xc4, /*!< MPL3115A2 WHO_AM_I register content */ }; /** * @enum SYS_MODE * @brief operating mode of MPL3115A2 */ enum SYS_MODE { STANDBY = 0, ACTIVE }; /** * @enum DR_STATUS_VALS * @brief flags for data overwrite and data ready */ enum DR_STATUS_VALS { TDR = 0x02, PDR = 0x04, PTDR = 0x08, TOW = 0x20, POW = 0x40, PTOW = 0x80 }; /** * @enum OUTPUT_MODE * @brief Select whether data is raw or post-processed */ enum OUTPUT_MODE { DATA_NORMAL = 0x00, DATA_RAW = 0x40 }; /** * @enum DATA_MODE * @brief Sets the pressure measurement post- processing mode for the sensor */ enum DATA_MODE { DM_BAROMETER = 0x00, DM_ALTIMETER = 0x80 }; /** * @enum OVERSAMPLE_RATIO * @brief values for oversample ratio * Note: sample time is 2.5 msec * ratio# i.e. OR_8 -> 2.5 * 8 = 20 msec */ enum OVERSAMPLE_RATIO { OR_1 = 0x00, OR_2 = 0x08, OR_4 = 0x10, OR_8 = 0x18, OR_16 = 0x20, OR_32 = 0x28, OR_64 = 0x30, OR_128 = 0x38 }; /** * @enum ACQUISITION_TIMER * @brief in active mode this sets time between samples in seconds */ enum ACQUISITION_TIMER { AT_1 = 0x00, AT_2, AT_4, AT_8, AT_16, AT_32, AT_64, AT_128, AT_256, AT_512, AT_1024, AT_2048, AT_4096, AT_8192, AT_16384, AT_32768 }; /** * @enum REGISTER * @brief The device register map */ enum REGISTER { STATUS = 0x0, OUT_P_MSB, OUT_P_CSB, OUT_P_LSB, OUT_T_MSB, OUT_T_LSB, DR_STATUS, OUT_P_DELTA_MSB, OUT_P_DELTA_CSB, OUT_P_DELTA_LSB, OUT_T_DELTA_MSB, OUT_T_DELTA_LSB, WHO_AM_I, F_STATUS, F_DATA, F_SETUP, TIME_DLY, SYSMOD, INT_SOURCE, PT_DATA_CFG, BAR_IN_MSB, BAR_IN_LSB, P_ARM_MSB, P_ARM_LSB, T_ARM, P_ARM_WND_MSB, P_ARM_WND_LSB, T_ARM_WND, P_MIN_MSB, P_MIN_CSB, P_MIN_LSB, T_MIN_MSB, T_MIN_LSB, P_MAX_MSB, P_MAX_CSB, P_MAX_LSB, T_MAX_MSB, T_MAX_LSB, CTRL_REG1, CTRL_REG2, CTRL_REG3, CTRL_REG4, CTRL_REG5, OFF_P, OFF_T, OFF_H }; /** Create the MPL3115A2 object * @param i2c - A defined I2C object * @param int1 - A defined InterruptIn object pointer. Default NULL for polling mode * @param int2 - A defined InterruptIn object pointer. Default NULL for polling mode * TODO - Need to add interrupt support */ MPL3115A2(I2C &i2c, InterruptIn* int1 = NULL, InterruptIn* int2 = NULL); /** Test the Who am I register for valid ID * @return Boolean true if valid device */ bool testWhoAmI(void) ; /** Setup the MPL3115A2 for standard barometric sensor read mode * @out_mode - Turns Data post processing ON/OFF using the OUTPUT_MODE enum * @data_mode - Sets Pressure or Altitude mode using the DATA_MODE enum * @os_ratio - Sets the Oversample ration using the OVERSAMPLE_RATIO enum * @measure_time - Sets the Aquisition time for Active mode using the ACQUISITION_TIMER enum * @return status of command * * This sets the resolution, range, data rate, oversample * mode, hi and lo pass filter. */ uint8_t setParameters(OUTPUT_MODE out_mode, DATA_MODE data_mode, OVERSAMPLE_RATIO os_ratio, ACQUISITION_TIMER measure_time) ; uint8_t enableFIFO(void) ; /** Put the MPL3115A2 in the Standby mode * @return status of command * TODO - need to implement function */ uint8_t standbyMode(void) ; /** Put the MPL3115A2 in the active mode * @return status of command */ uint8_t activeMode(void) ; /** Triggers the MPL3115A2 to take one measurement in Active or Standby mode * @return status of command */ uint8_t triggerOneShot(void) ; /** Set the sea level equivalent pressure for Altitude mode * @alti_calib - Value is Equivalent sea level pressure for measurement location (2 Pa resolution) * @return status byte */ uint8_t setAltitudeCalib(int16_t alti_calib) ; /** Clears all minimum and maximum data registers * @return status of command */ uint8_t clearMinMaxRegs(void) ; /** Check the MPL3115A2 status register * @return status byte */ uint8_t getStatus(void) ; /** Get the Pressure or Altitude data * @return The last valid pressure based reading from the barometric sensor */ int32_t getBaroData(void); /** Get the Temperature data * @return The last valid temperature reading from the barometric sensor */ int16_t getTempData(void); /** Get the Minimum Pressure or Altitude data * @param Boolean TRUE clears the register after reading * @return The Minimum Pressure or Altitude read since last cleared */ int32_t getMinBaro(bool clear_data); /** Get the Maximum Pressure or Altitude data * @param Boolean true clears the register after reading * @return The Maximum Pressure or Altitude read since last cleared */ int32_t getMaxBaro(bool clear_data); /** Get the Minimum Temperature data * @param Boolean true clears the register after reading * @return The Minimum temperature read since last cleared */ int16_t getMinTemp(bool clear_data); /** Get the Maximum Temperature data * @param Boolean true clears the register after reading * @return The Maximum temperature read since last cleared */ int16_t getMaxTemp(bool clear_data); /** Get the MP3115A2 data structure * @param Boolean true clears all MIN/MAX registers after reading * @return MPL3115A2_DATA structure */ MPL3115A2_DATA getAllData(bool clear_data); /* * Need to add interrupt support code here when I get the chance */ private: I2C *_i2c; InterruptIn *_int1; InterruptIn *_int2; MPL3115A2_DATA _data; bool _polling_mode; uint8_t static const _i2c_addr = (0x60 <<1); uint8_t init(void); /** Write to a register * Note: most writes are only valid in stop mode * @param reg - The register to be written * @param data - The data to be written * @param count - number of bytes to send, assumes 1 byte if not specified * @return - status of command */ uint8_t writeRegister(uint8_t reg, char* data, uint8_t count = 1); /** Read from a register * @param reg - The register to read from * @param data - buffer of data to be read * @param count - number of bytes to send, assumes 1 byte if not specified * @return - status of command */ uint8_t readRegister(uint8_t reg, char* data, uint8_t count = 1); }; #endif