Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

Committer:
lo
Date:
Tue Sep 18 19:41:38 2018 +0000
Revision:
26:271d2d510f6c
Child:
32:3bef9b81f639
added components implementations

Who changed what in which revision?

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