Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

Committer:
lo
Date:
Thu Oct 04 07:24:28 2018 +0000
Revision:
32:3bef9b81f639
Parent:
26:271d2d510f6c
Child:
34:aa6d3a83dafc
updated Components constructor and Readvalue method, enabled back contructor in Service and Component classes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lo 32:3bef9b81f639 1 /*
lo 32:3bef9b81f639 2 * bme280_component.hpp
lo 32:3bef9b81f639 3 *
lo 32:3bef9b81f639 4 * Created on: 17 sept. 2018
lo 32:3bef9b81f639 5 * Author: hoel
lo 32:3bef9b81f639 6 */
lo 32:3bef9b81f639 7
lo 32:3bef9b81f639 8 #ifndef BME280_COMPONENT_HPP_
lo 32:3bef9b81f639 9 #define BME280_COMPONENT_HPP_
lo 32:3bef9b81f639 10
lo 32:3bef9b81f639 11 #include <iostream>
lo 32:3bef9b81f639 12 #include <cstdlib>
lo 32:3bef9b81f639 13 #include "mbed.h"
lo 32:3bef9b81f639 14 #include "Context.h"
lo 32:3bef9b81f639 15 #include "Service.hpp"
lo 32:3bef9b81f639 16 #include "Component.hpp"
lo 32:3bef9b81f639 17
lo 32:3bef9b81f639 18 using namespace std;
lo 32:3bef9b81f639 19 using namespace misnet;
lo 32:3bef9b81f639 20
lo 32:3bef9b81f639 21 #define DEF_SLAVE_ADDR (0x77 << 1) // SDO low
lo 32:3bef9b81f639 22 //#define _DEBUG
lo 32:3bef9b81f639 23 #ifdef _DEBUG
lo 32:3bef9b81f639 24 extern Serial pc2;
lo 32:3bef9b81f639 25 #define DEBUG_PRINT(...) pc2.printf(__VA_ARGS__)
lo 32:3bef9b81f639 26 #else
lo 32:3bef9b81f639 27 #define DEBUG_PRINT(...)
lo 32:3bef9b81f639 28 #endif
lo 32:3bef9b81f639 29
lo 32:3bef9b81f639 30 class bme280_component : public Component{
lo 32:3bef9b81f639 31
lo 32:3bef9b81f639 32 private:
lo 32:3bef9b81f639 33 I2C *i2c_p;
lo 32:3bef9b81f639 34 I2C &i2c;
lo 32:3bef9b81f639 35 char address;
lo 32:3bef9b81f639 36 uint16_t dig_T1=0;
lo 32:3bef9b81f639 37 int16_t dig_T2=0, dig_T3=0;
lo 32:3bef9b81f639 38 uint16_t dig_P1=0;
lo 32:3bef9b81f639 39 int16_t dig_P2=0, dig_P3=0, dig_P4=0, dig_P5=0, dig_P6=0, dig_P7=0, dig_P8=0, dig_P9=0;
lo 32:3bef9b81f639 40 uint16_t dig_H1=0, dig_H3=0;
lo 32:3bef9b81f639 41 int16_t dig_H2=0, dig_H4=0, dig_H5=0, dig_H6=0;
lo 32:3bef9b81f639 42 int32_t t_fine;
lo 32:3bef9b81f639 43 PinName sda = I2C_SDA; // TODO : clean
lo 32:3bef9b81f639 44 PinName scl = I2C_SCL; // TODO : clean
lo 32:3bef9b81f639 45 char slave_adr = DEF_SLAVE_ADDR; // TODO : clean
lo 32:3bef9b81f639 46
lo 32:3bef9b81f639 47 public:
lo 32:3bef9b81f639 48 bme280_component(COMPONENT_ID id, std::vector<Service*>& services):
lo 32:3bef9b81f639 49 // TODO : implement peripheral pin arguments
lo 32:3bef9b81f639 50 // BME280_component(PinName sda, PinName scl, char slave_adr,COMPONENT_ID id, std::vector<Service*>& services):
lo 32:3bef9b81f639 51 i2c_p(new I2C(sda, scl)),
lo 32:3bef9b81f639 52 i2c(*i2c_p),
lo 32:3bef9b81f639 53 address(slave_adr),
lo 32:3bef9b81f639 54 t_fine(0)//,
lo 32:3bef9b81f639 55 {
lo 32:3bef9b81f639 56 this->setServices(services);
lo 32:3bef9b81f639 57 this->setId(id);
lo 32:3bef9b81f639 58 }
lo 32:3bef9b81f639 59 ~bme280_component(){
lo 32:3bef9b81f639 60 if (NULL != bme280_component::i2c_p)
lo 32:3bef9b81f639 61 delete bme280_component::i2c_p;
lo 32:3bef9b81f639 62 }
lo 32:3bef9b81f639 63 bool init(void){
lo 32:3bef9b81f639 64
lo 32:3bef9b81f639 65 char cmd[18];
lo 32:3bef9b81f639 66
lo 32:3bef9b81f639 67 cmd[0] = 0xf2; // ctrl_hum
lo 32:3bef9b81f639 68 cmd[1] = 0x01; // Humidity oversampling x1
lo 32:3bef9b81f639 69 i2c.write(address, cmd, 2);
lo 32:3bef9b81f639 70
lo 32:3bef9b81f639 71 cmd[0] = 0xf4; // ctrl_meas
lo 32:3bef9b81f639 72 cmd[1] = 0x27; // Temperature oversampling x1, Pressure oversampling x1, Normal mode
lo 32:3bef9b81f639 73 i2c.write(address, cmd, 2);
lo 32:3bef9b81f639 74
lo 32:3bef9b81f639 75 cmd[0] = 0xf5; // config
lo 32:3bef9b81f639 76 cmd[1] = 0xa0; // Standby 1000ms, Filter off
lo 32:3bef9b81f639 77 i2c.write(address, cmd, 2);
lo 32:3bef9b81f639 78
lo 32:3bef9b81f639 79 cmd[0] = 0x88; // read dig_T regs
lo 32:3bef9b81f639 80 i2c.write(address, cmd, 1);
lo 32:3bef9b81f639 81 i2c.read(address, cmd, 6);
lo 32:3bef9b81f639 82
lo 32:3bef9b81f639 83 dig_T1 = (cmd[1] << 8) | cmd[0];
lo 32:3bef9b81f639 84 dig_T2 = (cmd[3] << 8) | cmd[2];
lo 32:3bef9b81f639 85 dig_T3 = (cmd[5] << 8) | cmd[4];
lo 32:3bef9b81f639 86
lo 32:3bef9b81f639 87 DEBUG_PRINT("dig_T = 0x%x, 0x%x, 0x%x\n", dig_T1, dig_T2, dig_T3);
lo 32:3bef9b81f639 88
lo 32:3bef9b81f639 89 cmd[0] = 0x8E; // read dig_P regs
lo 32:3bef9b81f639 90 i2c.write(address, cmd, 1);
lo 32:3bef9b81f639 91 i2c.read(address, cmd, 18);
lo 32:3bef9b81f639 92
lo 32:3bef9b81f639 93 dig_P1 = (cmd[ 1] << 8) | cmd[ 0];
lo 32:3bef9b81f639 94 dig_P2 = (cmd[ 3] << 8) | cmd[ 2];
lo 32:3bef9b81f639 95 dig_P3 = (cmd[ 5] << 8) | cmd[ 4];
lo 32:3bef9b81f639 96 dig_P4 = (cmd[ 7] << 8) | cmd[ 6];
lo 32:3bef9b81f639 97 dig_P5 = (cmd[ 9] << 8) | cmd[ 8];
lo 32:3bef9b81f639 98 dig_P6 = (cmd[11] << 8) | cmd[10];
lo 32:3bef9b81f639 99 dig_P7 = (cmd[13] << 8) | cmd[12];
lo 32:3bef9b81f639 100 dig_P8 = (cmd[15] << 8) | cmd[14];
lo 32:3bef9b81f639 101 dig_P9 = (cmd[17] << 8) | cmd[16];
lo 32:3bef9b81f639 102
lo 32:3bef9b81f639 103 DEBUG_PRINT("dig_P = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9);
lo 32:3bef9b81f639 104
lo 32:3bef9b81f639 105 cmd[0] = 0xA1; // read dig_H regs
lo 32:3bef9b81f639 106 i2c.write(address, cmd, 1);
lo 32:3bef9b81f639 107 i2c.read(address, cmd, 1);
lo 32:3bef9b81f639 108 cmd[1] = 0xE1; // read dig_H regs
lo 32:3bef9b81f639 109 i2c.write(address, &cmd[1], 1);
lo 32:3bef9b81f639 110 i2c.read(address, &cmd[1], 7);
lo 32:3bef9b81f639 111
lo 32:3bef9b81f639 112 dig_H1 = cmd[0];
lo 32:3bef9b81f639 113 dig_H2 = (cmd[2] << 8) | cmd[1];
lo 32:3bef9b81f639 114 dig_H3 = cmd[3];
lo 32:3bef9b81f639 115 dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f);
lo 32:3bef9b81f639 116 dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f);
lo 32:3bef9b81f639 117 dig_H6 = cmd[7];
lo 32:3bef9b81f639 118
lo 32:3bef9b81f639 119 DEBUG_PRINT("dig_H = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", dig_H1, dig_H2, dig_H3, dig_H4, dig_H5, dig_H6);
lo 32:3bef9b81f639 120 return false;
lo 32:3bef9b81f639 121 }
lo 32:3bef9b81f639 122 void readValues(void){
lo 32:3bef9b81f639 123 for (std::vector<misnet::Service*>::iterator
lo 32:3bef9b81f639 124 srvIt = this->getServices().begin();
lo 32:3bef9b81f639 125 srvIt != this->getServices().end();
lo 32:3bef9b81f639 126 srvIt++) {
lo 32:3bef9b81f639 127 (*srvIt)->readValue();
lo 32:3bef9b81f639 128 }
lo 32:3bef9b81f639 129 }
lo 32:3bef9b81f639 130
lo 32:3bef9b81f639 131 class bme280_temperature : public Service {
lo 26:271d2d510f6c 132
lo 32:3bef9b81f639 133 public:
lo 32:3bef9b81f639 134 bme280_temperature(
lo 32:3bef9b81f639 135 DEVICE_TYPE type,
lo 32:3bef9b81f639 136 MISNET_CODE misnet_code,
lo 32:3bef9b81f639 137 STATE state,
lo 32:3bef9b81f639 138 ACCESS_TYPE access_type,
lo 32:3bef9b81f639 139 REQUEST_MODE request_mode,
lo 32:3bef9b81f639 140 UP_MODE up_mode,
lo 32:3bef9b81f639 141 ACCESS_PIN access_pins[6],
lo 32:3bef9b81f639 142 uint32_t subsample_rate,
lo 32:3bef9b81f639 143 ACTION action,
lo 32:3bef9b81f639 144 OUTPUT_MODE output_mode,
lo 32:3bef9b81f639 145 string comment,
lo 32:3bef9b81f639 146 bme280_component* parent ):
lo 32:3bef9b81f639 147 Service(type, misnet_code, state, access_type, request_mode,
lo 32:3bef9b81f639 148 up_mode, access_pins, subsample_rate, action, output_mode, comment)
lo 32:3bef9b81f639 149 {
lo 32:3bef9b81f639 150 this->parent = parent;
lo 32:3bef9b81f639 151 }
lo 32:3bef9b81f639 152 virtual ~bme280_temperature() {}
lo 32:3bef9b81f639 153
lo 32:3bef9b81f639 154 private:
lo 32:3bef9b81f639 155 bme280_component *parent;
lo 32:3bef9b81f639 156 bool readValue(void) {
lo 32:3bef9b81f639 157 uint32_t temp_raw;
lo 32:3bef9b81f639 158 float tempf;
lo 32:3bef9b81f639 159 char cmd[4];
lo 32:3bef9b81f639 160
lo 32:3bef9b81f639 161 cmd[0] = 0xfa; // temp_msb
lo 32:3bef9b81f639 162 parent->i2c.write(parent->address, cmd, 1);
lo 32:3bef9b81f639 163 parent->i2c.read(parent->address, &cmd[1], 3);
lo 32:3bef9b81f639 164 temp_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
lo 32:3bef9b81f639 165 int32_t temp;
lo 32:3bef9b81f639 166 temp =
lo 32:3bef9b81f639 167 (((((temp_raw >> 3) - (parent->dig_T1 << 1))) * parent->dig_T2) >> 11) +
lo 32:3bef9b81f639 168 ((((((temp_raw >> 4) - parent->dig_T1) * ((temp_raw >> 4) - parent->dig_T1)) >> 12) * parent->dig_T3) >> 14);
lo 32:3bef9b81f639 169 parent->t_fine = temp;
lo 32:3bef9b81f639 170 temp = (temp * 5 + 128) >> 8;
lo 32:3bef9b81f639 171 tempf = (float)temp;
lo 32:3bef9b81f639 172 this->getValueAddress().setFloatValue(tempf/100.0f);
lo 32:3bef9b81f639 173 this->savePreviousValue();
lo 32:3bef9b81f639 174 return false;
lo 32:3bef9b81f639 175 }
lo 32:3bef9b81f639 176 };
lo 32:3bef9b81f639 177
lo 32:3bef9b81f639 178 class bme280_humidity : public Service {
lo 32:3bef9b81f639 179
lo 32:3bef9b81f639 180 public:
lo 32:3bef9b81f639 181 bme280_humidity(
lo 32:3bef9b81f639 182 DEVICE_TYPE type,
lo 32:3bef9b81f639 183 MISNET_CODE misnet_code,
lo 32:3bef9b81f639 184 STATE state,
lo 32:3bef9b81f639 185 ACCESS_TYPE access_type,
lo 32:3bef9b81f639 186 REQUEST_MODE request_mode,
lo 32:3bef9b81f639 187 UP_MODE up_mode,
lo 32:3bef9b81f639 188 ACCESS_PIN access_pins[6],
lo 32:3bef9b81f639 189 uint32_t subsample_rate,
lo 32:3bef9b81f639 190 ACTION action,
lo 32:3bef9b81f639 191 OUTPUT_MODE output_mode,
lo 32:3bef9b81f639 192 string comment,
lo 32:3bef9b81f639 193 bme280_component* parent
lo 32:3bef9b81f639 194 ) :
lo 32:3bef9b81f639 195 Service(type, misnet_code, state, access_type, request_mode,
lo 32:3bef9b81f639 196 up_mode, access_pins, subsample_rate, action, output_mode, comment)
lo 32:3bef9b81f639 197 {
lo 32:3bef9b81f639 198 this->parent = parent;
lo 32:3bef9b81f639 199 }
lo 32:3bef9b81f639 200 virtual ~bme280_humidity() {}
lo 32:3bef9b81f639 201
lo 32:3bef9b81f639 202 private:
lo 32:3bef9b81f639 203 bme280_component *parent;
lo 32:3bef9b81f639 204 bool readValue(void){
lo 32:3bef9b81f639 205 printf(" ID %d,", this->getMisnetCode());
lo 32:3bef9b81f639 206 uint32_t hum_raw;
lo 32:3bef9b81f639 207 float humf;
lo 32:3bef9b81f639 208 char cmd[4];
lo 32:3bef9b81f639 209
lo 32:3bef9b81f639 210 cmd[0] = 0xfd; // hum_msb
lo 32:3bef9b81f639 211 parent->i2c.write(parent->address, cmd, 1);
lo 32:3bef9b81f639 212 parent->i2c.read(parent->address, &cmd[1], 2);
lo 32:3bef9b81f639 213 // TODO return true if reading result is invalid
lo 32:3bef9b81f639 214 hum_raw = (cmd[1] << 8) | cmd[2];
lo 32:3bef9b81f639 215 int32_t v_x1;
lo 32:3bef9b81f639 216 v_x1 = parent->t_fine - 76800;
lo 32:3bef9b81f639 217 v_x1 = (((((hum_raw << 14) -(((int32_t)parent->dig_H4) << 20) - (((int32_t)parent->dig_H5) * v_x1)) +
lo 32:3bef9b81f639 218 ((int32_t)16384)) >> 15) * (((((((v_x1 * (int32_t)parent->dig_H6) >> 10) *
lo 32:3bef9b81f639 219 (((v_x1 * ((int32_t)parent->dig_H3)) >> 11) + 32768)) >> 10) + 2097152) *
lo 32:3bef9b81f639 220 (int32_t)parent->dig_H2 + 8192) >> 14));
lo 32:3bef9b81f639 221 v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * (int32_t)parent->dig_H1) >> 4));
lo 32:3bef9b81f639 222 v_x1 = (v_x1 < 0 ? 0 : v_x1);
lo 32:3bef9b81f639 223 v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
lo 32:3bef9b81f639 224 humf = (float)(v_x1 >> 12);
lo 32:3bef9b81f639 225 this->getValueAddress().setFloatValue(humf/1024.0f);
lo 32:3bef9b81f639 226 this->savePreviousValue();
lo 32:3bef9b81f639 227 return false;
lo 32:3bef9b81f639 228 }
lo 32:3bef9b81f639 229 };
lo 32:3bef9b81f639 230
lo 32:3bef9b81f639 231 class bme280_pressure : public Service {
lo 32:3bef9b81f639 232
lo 32:3bef9b81f639 233 public:
lo 32:3bef9b81f639 234 bme280_pressure(
lo 32:3bef9b81f639 235 DEVICE_TYPE type,
lo 32:3bef9b81f639 236 MISNET_CODE misnet_code,
lo 32:3bef9b81f639 237 STATE state,
lo 32:3bef9b81f639 238 ACCESS_TYPE access_type,
lo 32:3bef9b81f639 239 REQUEST_MODE request_mode,
lo 32:3bef9b81f639 240 UP_MODE up_mode,
lo 32:3bef9b81f639 241 ACCESS_PIN access_pins[6],
lo 32:3bef9b81f639 242 uint32_t subsample_rate,
lo 32:3bef9b81f639 243 ACTION action,
lo 32:3bef9b81f639 244 OUTPUT_MODE output_mode,
lo 32:3bef9b81f639 245 string comment,
lo 32:3bef9b81f639 246 bme280_component* parent
lo 32:3bef9b81f639 247 ) :
lo 32:3bef9b81f639 248 Service(type, misnet_code, state, access_type, request_mode,
lo 32:3bef9b81f639 249 up_mode, access_pins, subsample_rate, action, output_mode, comment)
lo 32:3bef9b81f639 250 {
lo 32:3bef9b81f639 251 this->parent = parent;
lo 32:3bef9b81f639 252 }
lo 32:3bef9b81f639 253 virtual ~bme280_pressure() {}
lo 32:3bef9b81f639 254
lo 32:3bef9b81f639 255 private:
lo 32:3bef9b81f639 256 bme280_component *parent;
lo 32:3bef9b81f639 257 bool readValue(void){
lo 32:3bef9b81f639 258
lo 32:3bef9b81f639 259 uint32_t press_raw;
lo 32:3bef9b81f639 260 float pressf;
lo 32:3bef9b81f639 261 char cmd[4];
lo 32:3bef9b81f639 262
lo 32:3bef9b81f639 263 cmd[0] = 0xf7; // press_msb
lo 32:3bef9b81f639 264 parent->i2c.write(parent->address, cmd, 1);
lo 32:3bef9b81f639 265 parent->i2c.read(parent->address, &cmd[1], 3);
lo 32:3bef9b81f639 266 // TODO return true if reading result is invalid
lo 32:3bef9b81f639 267 press_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
lo 32:3bef9b81f639 268 int32_t var1, var2;
lo 32:3bef9b81f639 269 uint32_t press;
lo 32:3bef9b81f639 270 var1 = (parent->t_fine >> 1) - 64000;
lo 32:3bef9b81f639 271 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * parent->dig_P6;
lo 32:3bef9b81f639 272 var2 = var2 + ((var1 * parent->dig_P5) << 1);
lo 32:3bef9b81f639 273 var2 = (var2 >> 2) + (parent->dig_P4 << 16);
lo 32:3bef9b81f639 274 var1 = (((parent->dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((parent->dig_P2 * var1) >> 1)) >> 18;
lo 32:3bef9b81f639 275 var1 = ((32768 + var1) * parent->dig_P1) >> 15;
lo 32:3bef9b81f639 276 if (var1 == 0) {
lo 32:3bef9b81f639 277 return 0;
lo 32:3bef9b81f639 278 }
lo 32:3bef9b81f639 279 press = (((1048576 - press_raw) - (var2 >> 12))) * 3125;
lo 32:3bef9b81f639 280 if(press < 0x80000000) {
lo 32:3bef9b81f639 281 press = (press << 1) / var1;
lo 32:3bef9b81f639 282 } else {
lo 32:3bef9b81f639 283 press = (press / var1) * 2;
lo 32:3bef9b81f639 284 }
lo 32:3bef9b81f639 285 var1 = ((int32_t)parent->dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12;
lo 32:3bef9b81f639 286 var2 = (((int32_t)(press >> 2)) * (int32_t)parent->dig_P8) >> 13;
lo 32:3bef9b81f639 287 press = (press + ((var1 + var2 + parent->dig_P7) >> 4));
lo 32:3bef9b81f639 288 pressf = (float)press;
lo 32:3bef9b81f639 289 this->getValueAddress().setFloatValue(pressf/100.0f);
lo 32:3bef9b81f639 290 this->savePreviousValue();
lo 32:3bef9b81f639 291 return false;
lo 32:3bef9b81f639 292 }
lo 32:3bef9b81f639 293 };
lo 32:3bef9b81f639 294 };
lo 32:3bef9b81f639 295
lo 32:3bef9b81f639 296 #endif /* BME280_COMPONENT_HPP_ */