This is a simple wrapper class for the MPL3115A5 pressure and temperature sensor. It allows either single readings for continuous readings using polling or interrupts. It also contains a wrapper class for mbed-rpc.
mpl3115a2.h
- Committer:
- rhourahane
- Date:
- 2015-03-22
- Revision:
- 0:b12a7d396be9
File content as of revision 0:b12a7d396be9:
#ifndef __MPL3115A2_H__ #define __MPL3115A2_H__ #include <mbed.h> /// Class to provide simple control of the Freescale MPL311A2 pressure and /// temperature sensor. The class allows the user to read the pressure as /// barometric, altimeter or raw and the temperature in Celsius. /// /// Reading can be taken either on demand or continuously using either polling /// or interrupts to wait for the next reading. /// /// The correct modes should be get before either calling getReadings for /// single readings or activate to start continuous readings. class MPL3115A2 { public: /// Enum for how the pressure data is to be read. enum DataMode { BarometricMode, ///< Barometric presure in Pascals AltimeterMode, ///< Altitude in meters RawMode ///< Raw values from internal DACs }; /// Enum for how consecutive readings are made enum ReadMode { Single, ///< Make a single reading when calling getReadings, chip remains in standby the rest of the time Polling, ///< Make consecutive readings by polling isDataReady, chip is active all the time. Interupt ///< Make consecutive readings with an interrupt raised when data is ready, chip is active all the time. }; /// Enum to allow specifying which of the chips two interrupt pins to use. enum InterruptPin { INT1, ///< Pin called INT1 on chip INT2 ///< Pin called INT2 on chip }; /// Create a new instance of the class using the specified pins for the I2C bus. /// Once initialised the chip is in standby mode. /// @param sda The pin name for the sda line of the I2C bus. /// @param scl The pin name for the scl line of the I2C bus. MPL3115A2(PinName sda, PinName scl); /// Read the chip id, this is a fixed value of 0xC4. /// @returns Chip id. int getId(void); /// Set the how the pressure is read. The default is BarometricMode if to /// be change then is must be called before getReadings or activate. /// @param mode New mode to read pressure in. void setDataMode(DataMode mode); /// Get the current setting for the pressure reading mode. /// @returns Current pressure reading mode. DataMode getDataMode(void); /// Set the how get continuous reading. The default is Single if to /// be change then is must be called before getReadings or activate. /// @param mode New continuous reading mode. void setReadMode(ReadMode mode); /// Get the current setting for the continuous reading mode. /// @returns Current continuous reading mode. ReadMode getReadMode(void); /// Set the number of samples to be used for each reading. /// The number must be a power of two between 1 and 128. /// @param samples Number of samples per reading. void setOverSampling(int samples); /// Get the number of samples to be used for each reading. /// @returns Number of samples per reading. int getOverSampling(void); /// Sets the number of seconds between consecutive readings. /// The number must be a power of two between 1 and 32768. /// @param period Number of seconds between consecutive readings. void setSamplingPeriod(int period); /// Get the number of seconds between consecutive readings. /// @returns Seconds between samples. int getSamplingPeriod(void); /// Set which of the chips two interrupt pins should be used to signal /// that the data is ready. It is up to the user to attach the interrupt /// handler to the correct MCU pin and then call either getStatus or /// getReadings within the handler to clear the interrupt. /// @param intPin Chip interrupt pin to signal data ready interrupts. void setDataReadyInt(InterruptPin intPin); /// Get the configured interrupt pin used to signal that the data /// is ready. /// @returns Current data ready interrupt pin. InterruptPin getDataReadyInt(void); /// Read the chips STATUS register. The register contains data ready and /// overwrite flags. /// @returns Value of the STATUS register. int getStatus(void); /// Returns true if there is data available to read. /// @returns True is data is available to read otherwise false. bool isDataReady(void); /// Put the chip into active state to allow taking of consecutive /// samples. How often the samples are taken depends on the sampling /// period, the maximum frequency is every one second and the minimum /// every 9 hours. void activate(); /// Gives the active state of the chip /// @returns True if the chip is in the active state otherwise false. bool isActive(); /// Puts the chip into the standby state and stops automatic readings. void standby(); /// Wait for and get the next readings for pressure and temperature. /// If the reading mode is Single then the chip is setup and a wait /// loop entered until the data is available. /// If the reading mode is Polling then the wait loop is entered until /// the next reading is available. /// If the reading mode is Interrupt then the wait loop will exit imediately /// as the data is already available. This will clear the interrupt. /// @param pres Reference to variable to hold the pressure reading in Pascals /// meters depending on the data mode. /// @param temp Reference to variable to hold the temperature reading in /// Celsius. /// @returns True is the reading was sucessful otherwise false. The reading will /// be unsuccessful if the data mode is raw. bool getReadings(float &pres, float &temp); private: float convTemperature(char *data); float convAltimeter(char *data); float convPressure(char *data); void readRegs(char addr, char *data, int len); void writeRegs(const char *data, int len); private: I2C m_i2c; int m_addr; ReadMode m_readMode; DataMode m_dataMode; int m_overSample; int m_samplePeriod; InterruptPin m_dataReadInt; }; #endif