Change to comply with mbed os 5.1, as the attach function as used has been deprecated

Dependents:   Barometer-Example LoRaWAN-demo-72-bootcamp

Fork of BMP085 by silabs-abakurs

BMP085 library supporting mbed os low power

BMP085.cpp

Committer:
abouillot
Date:
2017-03-02
Revision:
5:64852447275f
Parent:
4:ed587a5331e4

File content as of revision 5:64852447275f:

#include "BMP085.h"

#if defined (TRACE)
extern Serial pc;
#endif

void BMP085::init(void)
{
    _callback.attach(this, &BMP085::_callback_handler);

    _cal_data.ac1 = read_cal_register(BMP085_CAL_AC1);
    _cal_data.ac2 = read_cal_register(BMP085_CAL_AC2);
    _cal_data.ac3 = read_cal_register(BMP085_CAL_AC3);
    _cal_data.ac4 = read_cal_register(BMP085_CAL_AC4);
    _cal_data.ac5 = read_cal_register(BMP085_CAL_AC5);
    _cal_data.ac6 = read_cal_register(BMP085_CAL_AC6);
    _cal_data.b1 = read_cal_register(BMP085_CAL_B1);
    _cal_data.b2 = read_cal_register(BMP085_CAL_B2);
    _cal_data.mb = read_cal_register(BMP085_CAL_MB);
    _cal_data.mc = read_cal_register(BMP085_CAL_MC);
    _cal_data.md = read_cal_register(BMP085_CAL_MD);
}


int BMP085::transfer(char *tx, int tx_len, char *rx, int rx_len)
{
    LowPowerTimeout delay;

#if defined (TRACE)
    pc.printf("transfer ");
#endif
    _state = BMP085_BUSY;
    _i2c.transfer(BMP085_ADDR, tx, tx_len, rx, rx_len, _callback);
    // set the timeout timer to guard the transfer
    delay.attach(callback(this, &BMP085::_callback_handler_timeout), 2.0);
    while(_state == BMP085_BUSY) {
        sleep();
    }
    delay.attach(NULL, 0);  // cancel timeout timer
    if (_state == BMP085_TIMEOUT) {
#if defined (TRACE)
        pc.printf("\ntimeout\n");
#endif
        _i2c.abort_transfer();
        return -33;
        }
#if defined (TRACE)
    pc.printf(" completed ");
#endif
    return 0;
}

int BMP085::wait(float wait)
{
    LowPowerTimeout delay;

#if defined (TRACE)
    pc.printf(" bmpWait ");
#endif
    _state = BMP085_BUSY;
    delay.attach(callback(this, &BMP085::_callback_handler_timeout), wait);
    while(_state == BMP085_BUSY) {
        sleep();
    }
#if defined (TRACE)
    pc.printf("over ");
#endif
    return 0;
}



uint16_t BMP085::read_cal_register(BMP085_Register reg)
{
#if defined (TRACE)
    pc.printf("\nread_cal_register ");
#endif
    _tx_buf[0] = reg;
    transfer((char*)_tx_buf, 1, (char*)_rx_buf, 2);
    return (_rx_buf[0] << 8) | _rx_buf[1];
}

uint16_t BMP085::read_uc_temperature(void)
{
#if defined (TRACE)
    pc.printf("\nread_uc_temperature ");
#endif
    _tx_buf[0] = BMP085_CTRL;
    _tx_buf[1] = BMP085_CMD_READ_TEMP;
    transfer((char*)_tx_buf, 2, (char*)NULL, 0);

    wait(0.01);

    _tx_buf[0] = BMP085_DATA_TEMP;
    transfer((char*)_tx_buf, 1, (char*)_rx_buf, 2);
    return (_rx_buf[0] << 8) | _rx_buf[1];
}

uint32_t BMP085::read_uc_pressure(void)
{
#if defined (TRACE)
    pc.printf("\nread_uc_pressure ");
#endif
    _tx_buf[0] = BMP085_CTRL;
    _tx_buf[1] = BMP085_CMD_READ_PRESSURE + ((uint8_t)_mode << 6);
    transfer((char*)_tx_buf, 2, (char*)NULL, 0);

    wait(0.02);

    _tx_buf[0] = BMP085_DATA_PRESSURE;
    transfer((char*)_tx_buf, 1, (char*)_rx_buf, 3);

    return ((_rx_buf[0] << 16) | (_rx_buf[1] << 8) | _rx_buf[2]) >> (8 - (uint8_t)_mode);
}

void BMP085::measure()
{
    int t, p, ut, up, x1, x2, x3, b3, b5, b6;
    uint32_t b4, b7;

    ut = read_uc_temperature();

    x1 = (ut - _cal_data.ac6) * _cal_data.ac5 / (1 << 15);
    x2 = (int)_cal_data.mc * (1 << 11) / (x1 + _cal_data.md);
    b5 = x1 + x2;
    t = (b5 + 8) / (1 << 4);
    _temperature = (float)t / 10.0;

    up = read_uc_pressure();

    b6 = b5 - 4000;
    x1 = (_cal_data.b2 * (b6 * b6 / (1 << 12))) / (1 << 11);
    x2 = _cal_data.ac2 * b6 / (1 << 11);
    x3 = x1 + x2;
    b3 = ((((unsigned int)_cal_data.ac1 * 4 + x3) << (int)_mode) + 2) / 4;
    x1 = _cal_data.ac3 * b6 / (1 << 13);
    x2 = (_cal_data.b1 * (b6 * b6 / (1 << 12))) / (1 << 16);
    x3 = ((x1 + x2) + 2) / (1 << 2);
    b4 = _cal_data.ac4 * (unsigned int)(x3 + 32768) / (1 << 15);
    b7 = ((unsigned int)up - b3) * (50000 >> (int)_mode);
    if (b7 < (unsigned int)0x80000000) {
        p = (b7 * 2) / b4;
    } else {
        p = (b7 / b4) * 2;
    }
    x1 = (p / (1 << 8)) * (p / (1 << 8));
    x1 = (x1 * 3038) / (1 << 16);
    x2 = (-7357 * p) / (1 << 16);
    p = p + (x1 + x2 + 3791) / (1 << 4);
    _pressure = (float)p / 100.0;
}

void BMP085::_callback_handler(int event)
{
    _state = BMP085_IDLE;
}

void BMP085::_callback_handler_timeout()
{
#if defined (TRACE)
    pc.printf(" bmp timeout callback ");
#endif
    _state = BMP085_TIMEOUT;
}