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

Committer:
asmellby
Date:
Wed Nov 18 12:47:49 2015 +0000
Revision:
1:33acd2e1edab
Parent:
0:fb197da45ba8
Child:
2:dcd90bee9ac2
Fix delay for ultra high resolution.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
asmellby 0:fb197da45ba8 1 #include "BMP085.h"
asmellby 0:fb197da45ba8 2
asmellby 0:fb197da45ba8 3 void BMP085::init(void) {
asmellby 0:fb197da45ba8 4 _callback.attach(this, &BMP085::_callback_handler);
asmellby 0:fb197da45ba8 5
asmellby 0:fb197da45ba8 6 _cal_data.ac1 = read_cal_register(BMP085_CAL_AC1);
asmellby 0:fb197da45ba8 7 _cal_data.ac2 = read_cal_register(BMP085_CAL_AC2);
asmellby 0:fb197da45ba8 8 _cal_data.ac3 = read_cal_register(BMP085_CAL_AC3);
asmellby 0:fb197da45ba8 9 _cal_data.ac4 = read_cal_register(BMP085_CAL_AC4);
asmellby 0:fb197da45ba8 10 _cal_data.ac5 = read_cal_register(BMP085_CAL_AC5);
asmellby 0:fb197da45ba8 11 _cal_data.ac6 = read_cal_register(BMP085_CAL_AC6);
asmellby 0:fb197da45ba8 12 _cal_data.b1 = read_cal_register(BMP085_CAL_B1);
asmellby 0:fb197da45ba8 13 _cal_data.b2 = read_cal_register(BMP085_CAL_B2);
asmellby 0:fb197da45ba8 14 _cal_data.mb = read_cal_register(BMP085_CAL_MB);
asmellby 0:fb197da45ba8 15 _cal_data.mc = read_cal_register(BMP085_CAL_MC);
asmellby 0:fb197da45ba8 16 _cal_data.md = read_cal_register(BMP085_CAL_MD);
asmellby 0:fb197da45ba8 17 }
asmellby 0:fb197da45ba8 18
asmellby 0:fb197da45ba8 19 uint16_t BMP085::read_cal_register(BMP085_Register reg) {
asmellby 0:fb197da45ba8 20 _tx_buf[0] = reg;
asmellby 0:fb197da45ba8 21 _state = BMP085_BUSY;
asmellby 0:fb197da45ba8 22 _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 1, (char*)_rx_buf, 2, _callback);
asmellby 0:fb197da45ba8 23 while(_state != BMP085_IDLE) {
asmellby 0:fb197da45ba8 24 sleep();
asmellby 0:fb197da45ba8 25 }
asmellby 0:fb197da45ba8 26 return (_rx_buf[0] << 8) | _rx_buf[1];
asmellby 0:fb197da45ba8 27 }
asmellby 0:fb197da45ba8 28
asmellby 0:fb197da45ba8 29 uint16_t BMP085::read_uc_temperature(void) {
asmellby 0:fb197da45ba8 30 LowPowerTimeout delay;
asmellby 0:fb197da45ba8 31 _tx_buf[0] = BMP085_CTRL;
asmellby 0:fb197da45ba8 32 _tx_buf[1] = BMP085_CMD_READ_TEMP;
asmellby 0:fb197da45ba8 33 _state = BMP085_BUSY;
asmellby 0:fb197da45ba8 34 _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 2, (char*)NULL, 0, _callback);
asmellby 0:fb197da45ba8 35 while(_state != BMP085_IDLE) {
asmellby 0:fb197da45ba8 36 sleep();
asmellby 0:fb197da45ba8 37 }
asmellby 0:fb197da45ba8 38
asmellby 0:fb197da45ba8 39 _state = BMP085_BUSY;
asmellby 0:fb197da45ba8 40 delay.attach(this, &BMP085::_callback_handler, 0.01);
asmellby 0:fb197da45ba8 41 while(_state != BMP085_IDLE) {
asmellby 0:fb197da45ba8 42 sleep();
asmellby 0:fb197da45ba8 43 }
asmellby 0:fb197da45ba8 44
asmellby 0:fb197da45ba8 45 _tx_buf[0] = BMP085_DATA_TEMP;
asmellby 0:fb197da45ba8 46 _state = BMP085_BUSY;
asmellby 0:fb197da45ba8 47 _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 1, (char*)_rx_buf, 2, _callback);
asmellby 0:fb197da45ba8 48 while(_state != BMP085_IDLE) {
asmellby 0:fb197da45ba8 49 sleep();
asmellby 0:fb197da45ba8 50 }
asmellby 0:fb197da45ba8 51 return (_rx_buf[0] << 8) | _rx_buf[1];
asmellby 0:fb197da45ba8 52 }
asmellby 0:fb197da45ba8 53
asmellby 0:fb197da45ba8 54 uint32_t BMP085::read_uc_pressure(void) {
asmellby 0:fb197da45ba8 55 LowPowerTimeout delay;
asmellby 0:fb197da45ba8 56 _tx_buf[0] = BMP085_CTRL;
asmellby 0:fb197da45ba8 57 _tx_buf[1] = BMP085_CMD_READ_PRESSURE + ((uint8_t)_mode << 6);
asmellby 0:fb197da45ba8 58 _state = BMP085_BUSY;
asmellby 0:fb197da45ba8 59 _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 2, (char*)NULL, 0, _callback);
asmellby 0:fb197da45ba8 60 while(_state != BMP085_IDLE) {
asmellby 0:fb197da45ba8 61 sleep();
asmellby 0:fb197da45ba8 62 }
asmellby 0:fb197da45ba8 63
asmellby 0:fb197da45ba8 64 _state = BMP085_BUSY;
asmellby 1:33acd2e1edab 65 delay.attach(this, &BMP085::_callback_handler, 0.02);
asmellby 0:fb197da45ba8 66 while(_state != BMP085_IDLE) {
asmellby 0:fb197da45ba8 67 sleep();
asmellby 0:fb197da45ba8 68 }
asmellby 0:fb197da45ba8 69
asmellby 0:fb197da45ba8 70 _tx_buf[0] = BMP085_DATA_PRESSURE;
asmellby 0:fb197da45ba8 71 _state = BMP085_BUSY;
asmellby 0:fb197da45ba8 72 _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 1, (char*)_rx_buf, 3, _callback);
asmellby 0:fb197da45ba8 73 while(_state != BMP085_IDLE) {
asmellby 0:fb197da45ba8 74 sleep();
asmellby 0:fb197da45ba8 75 }
asmellby 0:fb197da45ba8 76 return ((_rx_buf[0] << 16) | (_rx_buf[1] << 8) | _rx_buf[2]) >> (8 - (uint8_t)_mode);
asmellby 0:fb197da45ba8 77 }
asmellby 0:fb197da45ba8 78
asmellby 0:fb197da45ba8 79 void BMP085::measure() {
asmellby 0:fb197da45ba8 80 int t, p, ut, up, x1, x2, x3, b3, b5, b6;
asmellby 0:fb197da45ba8 81 uint32_t b4, b7;
asmellby 0:fb197da45ba8 82
asmellby 0:fb197da45ba8 83 ut = read_uc_temperature();
asmellby 0:fb197da45ba8 84
asmellby 0:fb197da45ba8 85 x1 = (ut - _cal_data.ac6) * _cal_data.ac5 / (1 << 15);
asmellby 0:fb197da45ba8 86 x2 = (int)_cal_data.mc * (1 << 11) / (x1 + _cal_data.md);
asmellby 0:fb197da45ba8 87 b5 = x1 + x2;
asmellby 0:fb197da45ba8 88 t = (b5 + 8) / (1 << 4);
asmellby 0:fb197da45ba8 89 _temperature = (float)t / 10.0;
asmellby 0:fb197da45ba8 90
asmellby 0:fb197da45ba8 91 up = read_uc_pressure();
asmellby 0:fb197da45ba8 92
asmellby 0:fb197da45ba8 93 b6 = b5 - 4000;
asmellby 0:fb197da45ba8 94 x1 = (_cal_data.b2 * (b6 * b6 / (1 << 12))) / (1 << 11);
asmellby 0:fb197da45ba8 95 x2 = _cal_data.ac2 * b6 / (1 << 11);
asmellby 0:fb197da45ba8 96 x3 = x1 + x2;
asmellby 0:fb197da45ba8 97 b3 = ((((unsigned int)_cal_data.ac1 * 4 + x3) << (int)_mode) + 2) / 4;
asmellby 0:fb197da45ba8 98 x1 = _cal_data.ac3 * b6 / (1 << 13);
asmellby 0:fb197da45ba8 99 x2 = (_cal_data.b1 * (b6 * b6 / (1 << 12))) / (1 << 16);
asmellby 0:fb197da45ba8 100 x3 = ((x1 + x2) + 2) / (1 << 2);
asmellby 0:fb197da45ba8 101 b4 = _cal_data.ac4 * (unsigned int)(x3 + 32768) / (1 << 15);
asmellby 0:fb197da45ba8 102 b7 = ((unsigned int)up - b3) * (50000 >> (int)_mode);
asmellby 0:fb197da45ba8 103 if (b7 < (unsigned int)0x80000000) {
asmellby 0:fb197da45ba8 104 p = (b7 * 2) / b4;
asmellby 0:fb197da45ba8 105 } else {
asmellby 0:fb197da45ba8 106 p = (b7 / b4) * 2;
asmellby 0:fb197da45ba8 107 }
asmellby 0:fb197da45ba8 108 x1 = (p / (1 << 8)) * (p / (1 << 8));
asmellby 0:fb197da45ba8 109 x1 = (x1 * 3038) / (1 << 16);
asmellby 0:fb197da45ba8 110 x2 = (-7357 * p) / (1 << 16);
asmellby 0:fb197da45ba8 111 p = p + (x1 + x2 + 3791) / (1 << 4);
asmellby 0:fb197da45ba8 112 _pressure = (float)p / 100.0;
asmellby 0:fb197da45ba8 113 }
asmellby 0:fb197da45ba8 114
asmellby 0:fb197da45ba8 115 void BMP085::_callback_handler(int event) {
asmellby 0:fb197da45ba8 116 _state = BMP085_IDLE;
asmellby 0:fb197da45ba8 117 }
asmellby 0:fb197da45ba8 118
asmellby 0:fb197da45ba8 119 void BMP085::_callback_handler() {
asmellby 0:fb197da45ba8 120 _state = BMP085_IDLE;
asmellby 0:fb197da45ba8 121 }