Elevator Altimeter
Fork of MPL3115A2 by
Diff: MPL3115A2.cpp
- Revision:
- 0:752c9dbed2fa
- Child:
- 1:6fdcf150410e
diff -r 000000000000 -r 752c9dbed2fa MPL3115A2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MPL3115A2.cpp Sun Dec 13 08:57:16 2015 +0000 @@ -0,0 +1,537 @@ +/* + * File description here + */ +#include "MPL3115A2.h" + +/* some definitions here */ +#define MPL_STATUS 0x00 +#define MPL_OUT_P_MSB 0x01 +#define MPL_OUT_P_CSB 0x02 +#define MPL_OUT_P_LSB 0x03 +#define MPL_OUT_T_MSB 0x04 +#define MPL_OUT_T_LSB 0x05 +#define MPL_DR_STATUS 0x06 +#define MPL_OUT_P_DELTA_MSB 0x07 +#define MPL_OUT_P_DELTA_CSB 0x08 +#define MPL_OUT_P_DELTA_LSB 0x09 +#define MPL_OUT_T_DELTA_MSB 0x0A +#define MPL_OUT_T_DELTA_LSB 0x0B +#define MPL_WHO_AM_I 0x0C +#define MPL_F_STATUS 0x0D +#define MPL_F_DATA 0x0E +#define MPL_F_SETUP 0x0F +#define MPL_TIME_DLY 0x10 +#define MPL_SYSMOD 0x11 +#define MPL_INT_SOURCE 0x12 +#define MPL_PT_DATA_CFG 0x13 +#define MPL_BAR_IN_MSB 0x14 +#define MPL_BAR_IN_LSB 0x15 +#define MPL_P_TGT_MSB 0x16 +#define MPL_P_TGT_LSB 0x17 +#define MPL_T_TGT 0x18 +#define MPL_P_WND_MSB 0x19 +#define MPL_P_WND_LSB 0x1A +#define MPL_T_WND 0x1B +#define MPL_P_MIN_MSB 0x1C +#define MPL_P_MIN_CSB 0x1D +#define MPL_P_MIN_LSB 0x1E +#define MPL_T_MIN_MSB 0x1F +#define MPL_T_MIN_LSB 0x20 +#define MPL_P_MAX_MSB 0x21 +#define MPL_P_MAX_CSB 0x22 +#define MPL_P_MAX_LSB 0x23 +#define MPL_T_MAX_MSB 0x24 +#define MPL_T_MAX_LSB 0x25 +#define MPL_CTRL_REG1 0x26 +#define MPL_CTRL_REG2 0x27 +#define MPL_CTRL_REG3 0x28 +#define MPL_CTRL_REG4 0x29 +#define MPL_CTRL_REG5 0x2A +#define MPL_OFF_P 0x2B +#define MPL_OFF_T 0x2C +#define MPL_OFF_H 0x2D +/* + * If F_MODE = 0, FIFO is disabled + * + * 0x00/0x06 Sensor Status Register (DR_STATUS) + * 0x01 Pressure Data Out MSB (OUT_P_MSB) + * 0x02 Pressure Data Out CSB (OUT_P_CSB) + * 0x03 Pressure Data Out LSB (OUT_P_LSB) + * 0x04 Temperature Data Out MSB (OUT_T_MSB) + * 0x05 Temperature Data out LSB (OUT_T_LSB) + * + * If F_Mode > 0, FIFO is circular buffer or full stop mode + * + * 0x00/0x0D Sensor Status Register (F_STATUS) + * 0x01 FIFO 8-bit Data Access (F_DATA) + * 0x02 Read to Reserved Area returns 00 + * 0x03 Read to Reserved Area returns 00 + * 0x04 Read to Reserved Area returns 00 + * 0x05 Read to Reserved Area returns 00 + * + * F_MODE = 00, FIFO is disabled + * F_MODE = 01, FIFO is circulated buffer + * F_MODE = 10, FIFO is full stop mode + */ + + +MPL3115A2::MPL3115A2(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { + // activate the peripheral +} + +MPL3115A2::~MPL3115A2() { } + +void MPL3115A2::readRegs(int addr, uint8_t * data, int len) { + char t[1] = {addr} ; + m_i2c.write(m_addr, t, 1, true) ; + m_i2c.read(m_addr, (char*)data, len) ; +} + +void MPL3115A2::writeRegs(uint8_t * data, int len) { + m_i2c.write(m_addr, (char *)data, len) ; +} + +uint8_t MPL3115A2::getStatus(void) { + uint8_t data[1] ; + readRegs(MPL_DR_STATUS, data, 1) ; + return( data[0] ) ; +} + +/* + * getAltitude returns the altitude in meters times 65536 + */ +uint32_t MPL3115A2::getAltitude(void) +{ + uint8_t tmp[3] ; + uint32_t data ; + + readRegs(MPL_OUT_P_MSB, tmp, 3) ; + data = (tmp[0]<<24)|(tmp[1]<<16)|(tmp[2]<<8) ; + return( data ) ; +} + +/* + * getPressure returns the pressure in Pascals times 64 + */ +uint32_t MPL3115A2::getPressure(void) +{ + uint8_t tmp[3] ; + uint32_t data ; + + readRegs(MPL_OUT_P_MSB, tmp, 3) ; + data = (tmp[0]<<16)|(tmp[1]<<8)|(tmp[2]) ; + return( data ) ; +} + +/* + * getTemperature returns the temperature in c-degree times 256 + */ +uint16_t MPL3115A2::getTemperature(void) +{ + uint8_t tmp[2] ; + uint16_t data ; + + readRegs(MPL_OUT_T_MSB, tmp, 2) ; + data = (tmp[0]<<8)|(tmp[1]) ; + return( data ) ; +} + +/* + * getAltDelta returns delta of alt in meters times 65536 + */ +int32_t MPL3115A2::getAltDelta(void) +{ + uint8_t tmp[3] ; + int32_t data ; + + readRegs(MPL_OUT_P_DELTA_MSB, tmp, 3) ; + data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ; + return( data ) ; +} + +/* + * getPrsDelta returns delta of pressure in Pascal times 16 + */ +int32_t MPL3115A2::getPrsDelta(void) +{ + uint8_t tmp[3] ; + int32_t data ; + + readRegs(MPL_OUT_P_DELTA_MSB, tmp, 3) ; + data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ; + return( data ) ; +} + +/* + * getTempDelta returns delta of temperature in c-degree times 16 + */ +int16_t MPL3115A2::getTempDelta(void) +{ + uint8_t tmp[2] ; + int16_t data ; + + readRegs(MPL_OUT_T_DELTA_MSB, tmp, 2) ; + data = (tmp[0]<<8) | (tmp[1]&0xF0) ; + return( data ) ; +} + +uint8_t MPL3115A2::getID(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_WHO_AM_I, tmp, 1) ; + return( tmp[0] ) ; +} + +uint8_t MPL3115A2::getFstatus(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_F_STATUS, tmp, 1) ; + return(tmp[0]) ; +} + +uint8_t MPL3115A2::getFdata(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_F_DATA, tmp, 1) ; + return(tmp[0]) ; +} + +uint8_t MPL3115A2::getFsetup(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_F_SETUP, tmp, 1) ; + return(tmp[0]) ; +} + +void MPL3115A2::setFsetup(uint8_t data) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_F_SETUP ; + tmp[1] = data ; + writeRegs(tmp, 2) ; +} + +uint8_t MPL3115A2::getTimeDelay(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_TIME_DLY, tmp, 1) ; + return( tmp[0] ) ; +} + +uint8_t MPL3115A2::getSysMod(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_SYSMOD, tmp, 1) ; + return( tmp[0] ) ; +} + +uint8_t MPL3115A2::getIntSource(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_INT_SOURCE, tmp, 1) ; + return( tmp[0] ) ; +} + +uint8_t MPL3115A2::getPtDataConfig(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_PT_DATA_CFG, tmp, 1) ; + return( tmp[0] ) ; +} + +void MPL3115A2::setPtDataConfig(uint8_t data) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_PT_DATA_CFG ; + tmp[1] = data ; + writeRegs(tmp, 2) ; +} + +uint16_t MPL3115A2::getBarIn(void) +{ + uint8_t tmp[2] ; + readRegs(MPL_BAR_IN_MSB, tmp, 2) ; + return( (uint16_t)tmp[0] ) ; +} + +void MPL3115A2::setBarIn(uint16_t data) +{ + uint8_t tmp[3] ; + tmp[0] = MPL_BAR_IN_MSB ; + tmp[1] = (data >> 8)&0xFF ; + tmp[2] = data & 0xFF ; + writeRegs(tmp, 3) ; +} + +int16_t MPL3115A2::getP_TGT(void) +{ + uint8_t tmp[2] ; + int16_t data ; + readRegs(MPL_P_TGT_MSB, tmp, 2) ; + data = (tmp[0] << 8) | tmp[1] ; + return( data ) ; +} + +void MPL3115A2::setP_TGT(int16_t data) +{ + uint8_t tmp[3] ; + tmp[0] = MPL_P_TGT_MSB ; + tmp[1] = (data >> 8) & 0xFF ; + tmp[2] = data & 0xFF ; + writeRegs(tmp, 3) ; +} + +int8_t MPL3115A2::getT_TGT(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_T_TGT, tmp, 1) ; + return( (int8_t)tmp[0] ) ; +} + +void MPL3115A2::setT_TGT(int8_t data) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_PT_DATA_CFG ; + tmp[1] = data ; + writeRegs(tmp, 2) ; +} + +uint16_t MPL3115A2::getP_WND(void) +{ + uint8_t tmp[2] ; + uint16_t data ; + readRegs(MPL_P_WND_MSB, tmp, 2) ; + data = (tmp[0]<<8) | tmp[1] ; + return(data) ; +} + +void MPL3115A2::setP_WND(uint16_t data) +{ + uint8_t tmp[3] ; + tmp[0] = MPL_P_WND_MSB ; + tmp[1] = (data >> 8)&0xFF ; + tmp[2] = data & 0xFF ; + writeRegs(tmp, 3) ; +} + +uint8_t MPL3115A2::getT_WND(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_T_WND, tmp, 1) ; + return(tmp[0]) ; +} + +void MPL3115A2::setT_WND(uint8_t data) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_T_WND ; + tmp[1] = data ; + writeRegs(tmp, 2) ; +} + +int32_t MPL3115A2::getP_MIN(void) +{ + uint8_t tmp[3] ; + int32_t data ; + readRegs(MPL_P_MIN_MSB, tmp, 3) ; + data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ; + return( data ) ; +} + +void MPL3115A2::setT_MIN(int32_t data) +{ + uint8_t tmp[4] ; + tmp[0] = MPL_P_MIN_MSB ; + tmp[1] = (data >> 24) & 0xFF ; + tmp[2] = (data >> 16) & 0xFF ; + tmp[3] = (data >> 8) & 0xF0 ; + writeRegs(tmp, 4) ; +} + +int32_t MPL3115A2::getP_MAX(void) +{ + uint8_t tmp[3] ; + int32_t data ; + readRegs(MPL_P_MAX_MSB, tmp, 3) ; + data = (tmp[0]<<24)|(tmp[1]<<16)|((tmp[2]&0xF0)<<8) ; + return( data ) ; +} + +void MPL3115A2::setP_MAX(int32_t data) +{ + uint8_t tmp[4] ; + tmp[0] = MPL_P_MAX_MSB ; + tmp[1] = (data >> 24) & 0xFF ; + tmp[2] = (data >> 16) & 0xFF ; + tmp[3] = (data >> 8) & 0xF0 ; + writeRegs(tmp, 4) ; +} + +int16_t MPL3115A2::getT_MIN(void) +{ + uint8_t tmp[2] ; + uint16_t data ; + readRegs(MPL_T_MIN_MSB, tmp, 2) ; + data = (tmp[0]<<8) | tmp[1] ; + return(data) ; +} + +void MPL3115A2::setT_MIN(int16_t data) +{ + uint8_t tmp[3] ; + tmp[0] = MPL_T_MIN_MSB ; + tmp[1] = (data >> 8) & 0xFF ; + tmp[2] = data & 0xFF ; + writeRegs(tmp, 3) ; +} + +int16_t MPL3115A2::getT_MAX(void) +{ + uint8_t tmp[2] ; + uint16_t data ; + readRegs(MPL_T_MAX_MSB, tmp, 2) ; + data = (tmp[0]<<8) | tmp[1] ; + return( data ) ; +} + +void MPL3115A2::setT_MAX(int16_t data) +{ + uint8_t tmp[3] ; + tmp[0] = MPL_T_MAX_MSB ; + tmp[1] = (data >> 8) & 0xFF ; + tmp[2] = data & 0xFF ; + writeRegs(tmp, 3) ; +} + +uint8_t MPL3115A2::getCTRL_REG1(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_CTRL_REG1, tmp, 1) ; + return( tmp[0] ) ; +} + +void MPL3115A2::setCTRL_REG1(uint8_t data) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_CTRL_REG1 ; + tmp[1] = data ; + writeRegs(tmp, 2) ; +} + +uint8_t MPL3115A2::getCTRL_REG2(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_CTRL_REG2, tmp, 1) ; + return( tmp[0] ) ; +} + +void MPL3115A2::setCTRL_REG2(uint8_t data) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_CTRL_REG2 ; + tmp[1] = data ; + writeRegs(tmp, 2) ; +} + +uint8_t MPL3115A2::getCTRL_REG3(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_CTRL_REG3, tmp, 1) ; + return( tmp[0] ) ; +} + +void MPL3115A2::setCTRL_REG3(uint8_t data) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_CTRL_REG3 ; + tmp[1] = data ; + writeRegs(tmp, 2) ; +} + +uint8_t MPL3115A2::getCTRL_REG4(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_CTRL_REG4, tmp, 1) ; + return( tmp[0] ) ; +} + +void MPL3115A2::setCTRL_REG4(uint8_t data) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_CTRL_REG4 ; + tmp[1] = data ; + writeRegs(tmp, 2) ; +} + +uint8_t MPL3115A2::getCTRL_REG5(void) +{ + uint8_t tmp[1] ; + readRegs(MPL_CTRL_REG5, tmp, 1) ; + return( tmp[0] ) ; +} + +void MPL3115A2::setCTRL_REG5(uint8_t data) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_CTRL_REG5 ; + tmp[1] = data ; + writeRegs(tmp, 2) ; +} + +uint16_t MPL3115A2::OneShot(void) +{ + uint8_t tmp[2] ; + uint16_t sample_time = 6 ; + tmp[0] = MPL_CTRL_REG1 ; + readRegs(tmp[0], &tmp[1], 1) ; + tmp[1] |= 0x02 ; + writeRegs(tmp, 2) ; + switch((tmp[1]>>3)&0x07) { + case 0: sample_time = 6 ; break ; + case 1: sample_time = 10 ; break ; + case 2: sample_time = 18 ; break ; + case 3: sample_time = 34 ; break ; + case 4: sample_time = 66 ; break ; + case 5: sample_time = 130 ; break ; + case 6: sample_time = 258 ; break ; + case 7: sample_time = 512 ; break ; + default: sample_time = 6 ; break ; + } + return( sample_time ) ; +} + +void MPL3115A2::standby(void) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_CTRL_REG1 ; + readRegs(tmp[0], &tmp[1], 1) ; + tmp[1] &= 0xFE ; + writeRegs(tmp, 2) ; +} + +void MPL3115A2::activate(void) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_CTRL_REG1 ; + readRegs(tmp[0], &tmp[1], 1) ; + tmp[1] |= 0x01 ; + writeRegs(tmp, 2) ; +} + +void MPL3115A2::modeAlt(void) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_CTRL_REG1 ; + readRegs(tmp[0], &tmp[1], 1) ; + tmp[1] |= 0x80 ; + writeRegs(tmp, 2) ; +} + +void MPL3115A2::modeBar(void) +{ + uint8_t tmp[2] ; + tmp[0] = MPL_CTRL_REG1 ; + readRegs(tmp[0], &tmp[1], 1) ; + tmp[1] &= 0x7F ; + writeRegs(tmp, 2) ; +} \ No newline at end of file