Sample code for AT&T IoT Services DevLab with IoT StarterKit.

Dependencies:   FXOS8700CQ M2XStreamClient-JMF WNCInterface jsonlite mbed-rtos mbed

Fork of WNCInterface_M2Xdemo by Avnet

Committer:
jk431j
Date:
Mon Dec 11 20:02:13 2017 +0000
Revision:
13:ee72ca4ca7d4
Parent:
4:08979e323c6e
Added wait for cellular link in WncController::softwareInitMdm

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jk431j 4:08979e323c6e 1 /* ===================================================================
jk431j 4:08979e323c6e 2 Copyright © 2016, AVNET Inc.
jk431j 4:08979e323c6e 3
jk431j 4:08979e323c6e 4 Licensed under the Apache License, Version 2.0 (the "License");
jk431j 4:08979e323c6e 5 you may not use this file except in compliance with the License.
jk431j 4:08979e323c6e 6 You may obtain a copy of the License at
jk431j 4:08979e323c6e 7
jk431j 4:08979e323c6e 8 http://www.apache.org/licenses/LICENSE-2.0
jk431j 4:08979e323c6e 9
jk431j 4:08979e323c6e 10 Unless required by applicable law or agreed to in writing,
jk431j 4:08979e323c6e 11 software distributed under the License is distributed on an
jk431j 4:08979e323c6e 12 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
jk431j 4:08979e323c6e 13 either express or implied. See the License for the specific
jk431j 4:08979e323c6e 14 language governing permissions and limitations under the License.
jk431j 4:08979e323c6e 15
jk431j 4:08979e323c6e 16 ======================================================================== */
jk431j 4:08979e323c6e 17
jk431j 4:08979e323c6e 18 #include "HTS221.h"
jk431j 4:08979e323c6e 19
jk431j 4:08979e323c6e 20
jk431j 4:08979e323c6e 21 // ------------------------------------------------------------------------------
jk431j 4:08979e323c6e 22 //jmf -- define I2C pins and functions to read & write to I2C device
jk431j 4:08979e323c6e 23
jk431j 4:08979e323c6e 24 #include <string>
jk431j 4:08979e323c6e 25 #include "mbed.h"
jk431j 4:08979e323c6e 26 extern I2C i2c;
jk431j 4:08979e323c6e 27
jk431j 4:08979e323c6e 28 // Read a single unsigned char from addressToRead and return it as a unsigned char
jk431j 4:08979e323c6e 29 unsigned char HTS221::readRegister(unsigned char slaveAddress, unsigned char ToRead)
jk431j 4:08979e323c6e 30 {
jk431j 4:08979e323c6e 31 char data = ToRead;
jk431j 4:08979e323c6e 32
jk431j 4:08979e323c6e 33 //i2c.write(slaveAddress, &data, 1, 0);
jk431j 4:08979e323c6e 34 i2c.write(slaveAddress, &data, 1, 1); //by Stefan
jk431j 4:08979e323c6e 35 i2c.read(slaveAddress, &data, 1, 0);
jk431j 4:08979e323c6e 36 return data;
jk431j 4:08979e323c6e 37 }
jk431j 4:08979e323c6e 38
jk431j 4:08979e323c6e 39 // Writes a single unsigned char (dataToWrite) into regToWrite
jk431j 4:08979e323c6e 40 int HTS221::writeRegister(unsigned char slaveAddress, unsigned char regToWrite, unsigned char dataToWrite)
jk431j 4:08979e323c6e 41 {
jk431j 4:08979e323c6e 42 const char data[] = {regToWrite, dataToWrite};
jk431j 4:08979e323c6e 43
jk431j 4:08979e323c6e 44 return i2c.write(slaveAddress,data,2,0);
jk431j 4:08979e323c6e 45 }
jk431j 4:08979e323c6e 46
jk431j 4:08979e323c6e 47
jk431j 4:08979e323c6e 48 //jmf end
jk431j 4:08979e323c6e 49 // ------------------------------------------------------------------------------
jk431j 4:08979e323c6e 50
jk431j 4:08979e323c6e 51 //static inline int humidityReady(uint8_t data) {
jk431j 4:08979e323c6e 52 // return (data & 0x02);
jk431j 4:08979e323c6e 53 //}
jk431j 4:08979e323c6e 54 //static inline int temperatureReady(uint8_t data) {
jk431j 4:08979e323c6e 55 // return (data & 0x01);
jk431j 4:08979e323c6e 56 //}
jk431j 4:08979e323c6e 57
jk431j 4:08979e323c6e 58
jk431j 4:08979e323c6e 59 HTS221::HTS221(void) : _address(HTS221_ADDRESS)
jk431j 4:08979e323c6e 60 {
jk431j 4:08979e323c6e 61 _temperature = 0;
jk431j 4:08979e323c6e 62 _humidity = 0;
jk431j 4:08979e323c6e 63 }
jk431j 4:08979e323c6e 64
jk431j 4:08979e323c6e 65
jk431j 4:08979e323c6e 66 int HTS221::begin(void)
jk431j 4:08979e323c6e 67 {
jk431j 4:08979e323c6e 68 uint8_t data;
jk431j 4:08979e323c6e 69
jk431j 4:08979e323c6e 70 data = readRegister(_address, WHO_AM_I);
jk431j 4:08979e323c6e 71 if (data == WHO_AM_I_RETURN){
jk431j 4:08979e323c6e 72 if (activate()){
jk431j 4:08979e323c6e 73 storeCalibration();
jk431j 4:08979e323c6e 74 return data;
jk431j 4:08979e323c6e 75 }
jk431j 4:08979e323c6e 76 }
jk431j 4:08979e323c6e 77
jk431j 4:08979e323c6e 78 return 0;
jk431j 4:08979e323c6e 79 }
jk431j 4:08979e323c6e 80
jk431j 4:08979e323c6e 81 int
jk431j 4:08979e323c6e 82 HTS221::storeCalibration(void)
jk431j 4:08979e323c6e 83 {
jk431j 4:08979e323c6e 84 uint8_t data;
jk431j 4:08979e323c6e 85 uint16_t tmp;
jk431j 4:08979e323c6e 86
jk431j 4:08979e323c6e 87 for (int reg=CALIB_START; reg<=CALIB_END; reg++) {
jk431j 4:08979e323c6e 88 if ((reg!=CALIB_START+8) && (reg!=CALIB_START+9) && (reg!=CALIB_START+4)) {
jk431j 4:08979e323c6e 89
jk431j 4:08979e323c6e 90 data = readRegister(HTS221_ADDRESS, reg);
jk431j 4:08979e323c6e 91
jk431j 4:08979e323c6e 92 switch (reg) {
jk431j 4:08979e323c6e 93 case CALIB_START:
jk431j 4:08979e323c6e 94 _h0_rH = data;
jk431j 4:08979e323c6e 95 break;
jk431j 4:08979e323c6e 96 case CALIB_START+1:
jk431j 4:08979e323c6e 97 _h1_rH = data;
jk431j 4:08979e323c6e 98 break;
jk431j 4:08979e323c6e 99 case CALIB_START+2:
jk431j 4:08979e323c6e 100 _T0_degC = data;
jk431j 4:08979e323c6e 101 break;
jk431j 4:08979e323c6e 102 case CALIB_START+3:
jk431j 4:08979e323c6e 103 _T1_degC = data;
jk431j 4:08979e323c6e 104 break;
jk431j 4:08979e323c6e 105
jk431j 4:08979e323c6e 106 case CALIB_START+5:
jk431j 4:08979e323c6e 107 tmp = _T0_degC;
jk431j 4:08979e323c6e 108 _T0_degC = (data&0x3)<<8;
jk431j 4:08979e323c6e 109 _T0_degC |= tmp;
jk431j 4:08979e323c6e 110
jk431j 4:08979e323c6e 111 tmp = _T1_degC;
jk431j 4:08979e323c6e 112 _T1_degC = ((data&0xC)>>2)<<8;
jk431j 4:08979e323c6e 113 _T1_degC |= tmp;
jk431j 4:08979e323c6e 114 break;
jk431j 4:08979e323c6e 115 case CALIB_START+6:
jk431j 4:08979e323c6e 116 _H0_T0 = data;
jk431j 4:08979e323c6e 117 break;
jk431j 4:08979e323c6e 118 case CALIB_START+7:
jk431j 4:08979e323c6e 119 _H0_T0 |= data<<8;
jk431j 4:08979e323c6e 120 break;
jk431j 4:08979e323c6e 121 case CALIB_START+0xA:
jk431j 4:08979e323c6e 122 _H1_T0 = data;
jk431j 4:08979e323c6e 123 break;
jk431j 4:08979e323c6e 124 case CALIB_START+0xB:
jk431j 4:08979e323c6e 125 _H1_T0 |= data <<8;
jk431j 4:08979e323c6e 126 break;
jk431j 4:08979e323c6e 127 case CALIB_START+0xC:
jk431j 4:08979e323c6e 128 _T0_OUT = data;
jk431j 4:08979e323c6e 129 break;
jk431j 4:08979e323c6e 130 case CALIB_START+0xD:
jk431j 4:08979e323c6e 131 _T0_OUT |= data << 8;
jk431j 4:08979e323c6e 132 break;
jk431j 4:08979e323c6e 133 case CALIB_START+0xE:
jk431j 4:08979e323c6e 134 _T1_OUT = data;
jk431j 4:08979e323c6e 135 break;
jk431j 4:08979e323c6e 136 case CALIB_START+0xF:
jk431j 4:08979e323c6e 137 _T1_OUT |= data << 8;
jk431j 4:08979e323c6e 138 break;
jk431j 4:08979e323c6e 139
jk431j 4:08979e323c6e 140
jk431j 4:08979e323c6e 141 case CALIB_START+8:
jk431j 4:08979e323c6e 142 case CALIB_START+9:
jk431j 4:08979e323c6e 143 case CALIB_START+4:
jk431j 4:08979e323c6e 144 //DO NOTHING
jk431j 4:08979e323c6e 145 break;
jk431j 4:08979e323c6e 146
jk431j 4:08979e323c6e 147 // to cover any possible error
jk431j 4:08979e323c6e 148 default:
jk431j 4:08979e323c6e 149 return false;
jk431j 4:08979e323c6e 150 } /* switch */
jk431j 4:08979e323c6e 151 } /* if */
jk431j 4:08979e323c6e 152 } /* for */
jk431j 4:08979e323c6e 153 return true;
jk431j 4:08979e323c6e 154 }
jk431j 4:08979e323c6e 155
jk431j 4:08979e323c6e 156
jk431j 4:08979e323c6e 157 int
jk431j 4:08979e323c6e 158 HTS221::activate(void)
jk431j 4:08979e323c6e 159 {
jk431j 4:08979e323c6e 160 uint8_t data;
jk431j 4:08979e323c6e 161
jk431j 4:08979e323c6e 162 data = readRegister(_address, CTRL_REG1);
jk431j 4:08979e323c6e 163 data |= POWER_UP;
jk431j 4:08979e323c6e 164 data |= ODR0_SET;
jk431j 4:08979e323c6e 165 writeRegister(_address, CTRL_REG1, data);
jk431j 4:08979e323c6e 166
jk431j 4:08979e323c6e 167 return true;
jk431j 4:08979e323c6e 168 }
jk431j 4:08979e323c6e 169
jk431j 4:08979e323c6e 170
jk431j 4:08979e323c6e 171 int HTS221::deactivate(void)
jk431j 4:08979e323c6e 172 {
jk431j 4:08979e323c6e 173 uint8_t data;
jk431j 4:08979e323c6e 174
jk431j 4:08979e323c6e 175 data = readRegister(_address, CTRL_REG1);
jk431j 4:08979e323c6e 176 data &= ~POWER_UP;
jk431j 4:08979e323c6e 177 writeRegister(_address, CTRL_REG1, data);
jk431j 4:08979e323c6e 178 return true;
jk431j 4:08979e323c6e 179 }
jk431j 4:08979e323c6e 180
jk431j 4:08979e323c6e 181
jk431j 4:08979e323c6e 182 int
jk431j 4:08979e323c6e 183 HTS221::bduActivate(void)
jk431j 4:08979e323c6e 184 {
jk431j 4:08979e323c6e 185 uint8_t data;
jk431j 4:08979e323c6e 186
jk431j 4:08979e323c6e 187 data = readRegister(_address, CTRL_REG1);
jk431j 4:08979e323c6e 188 data |= BDU_SET;
jk431j 4:08979e323c6e 189 writeRegister(_address, CTRL_REG1, data);
jk431j 4:08979e323c6e 190
jk431j 4:08979e323c6e 191 return true;
jk431j 4:08979e323c6e 192 }
jk431j 4:08979e323c6e 193
jk431j 4:08979e323c6e 194
jk431j 4:08979e323c6e 195 int
jk431j 4:08979e323c6e 196 HTS221::bduDeactivate(void)
jk431j 4:08979e323c6e 197 {
jk431j 4:08979e323c6e 198 uint8_t data;
jk431j 4:08979e323c6e 199
jk431j 4:08979e323c6e 200 data = readRegister(_address, CTRL_REG1);
jk431j 4:08979e323c6e 201 data &= ~BDU_SET;
jk431j 4:08979e323c6e 202 writeRegister(_address, CTRL_REG1, data);
jk431j 4:08979e323c6e 203 return true;
jk431j 4:08979e323c6e 204 }
jk431j 4:08979e323c6e 205
jk431j 4:08979e323c6e 206
jk431j 4:08979e323c6e 207 int
jk431j 4:08979e323c6e 208 HTS221::readHumidity(void)
jk431j 4:08979e323c6e 209 {
jk431j 4:08979e323c6e 210 uint8_t data = 0;
jk431j 4:08979e323c6e 211 uint16_t h_out = 0;
jk431j 4:08979e323c6e 212 double h_temp = 0.0;
jk431j 4:08979e323c6e 213 double hum = 0.0;
jk431j 4:08979e323c6e 214
jk431j 4:08979e323c6e 215 data = readRegister(_address, STATUS_REG);
jk431j 4:08979e323c6e 216
jk431j 4:08979e323c6e 217 if (data & HUMIDITY_READY) {
jk431j 4:08979e323c6e 218 data = readRegister(_address, HUMIDITY_H_REG);
jk431j 4:08979e323c6e 219 h_out = data << 8; // MSB
jk431j 4:08979e323c6e 220 data = readRegister(_address, HUMIDITY_L_REG);
jk431j 4:08979e323c6e 221 h_out |= data; // LSB
jk431j 4:08979e323c6e 222
jk431j 4:08979e323c6e 223 // Decode Humidity
jk431j 4:08979e323c6e 224 hum = ((int16_t)(_h1_rH) - (int16_t)(_h0_rH))/2.0; // remove x2 multiple
jk431j 4:08979e323c6e 225
jk431j 4:08979e323c6e 226 // Calculate humidity in decimal of grade centigrades i.e. 15.0 = 150.
jk431j 4:08979e323c6e 227 h_temp = (((int16_t)h_out - (int16_t)_H0_T0) * hum) / ((int16_t)_H1_T0 - (int16_t)_H0_T0);
jk431j 4:08979e323c6e 228 hum = ((int16_t)_h0_rH) / 2.0; // remove x2 multiple
jk431j 4:08979e323c6e 229 _humidity = (int16_t)((hum + h_temp)); // provide signed % measurement unit
jk431j 4:08979e323c6e 230 }
jk431j 4:08979e323c6e 231 return _humidity;
jk431j 4:08979e323c6e 232 }
jk431j 4:08979e323c6e 233
jk431j 4:08979e323c6e 234
jk431j 4:08979e323c6e 235
jk431j 4:08979e323c6e 236 double
jk431j 4:08979e323c6e 237 HTS221::readTemperature(void)
jk431j 4:08979e323c6e 238 {
jk431j 4:08979e323c6e 239 uint8_t data = 0;
jk431j 4:08979e323c6e 240 uint16_t t_out = 0;
jk431j 4:08979e323c6e 241 double t_temp = 0.0;
jk431j 4:08979e323c6e 242 double deg = 0.0;
jk431j 4:08979e323c6e 243
jk431j 4:08979e323c6e 244 data = readRegister(_address, STATUS_REG);
jk431j 4:08979e323c6e 245
jk431j 4:08979e323c6e 246 if (data & TEMPERATURE_READY) {
jk431j 4:08979e323c6e 247
jk431j 4:08979e323c6e 248 data= readRegister(_address, TEMP_H_REG);
jk431j 4:08979e323c6e 249 t_out = data << 8; // MSB
jk431j 4:08979e323c6e 250 data = readRegister(_address, TEMP_L_REG);
jk431j 4:08979e323c6e 251 t_out |= data; // LSB
jk431j 4:08979e323c6e 252
jk431j 4:08979e323c6e 253 // Decode Temperature
jk431j 4:08979e323c6e 254 deg = ((int16_t)(_T1_degC) - (int16_t)(_T0_degC))/8.0; // remove x8 multiple
jk431j 4:08979e323c6e 255
jk431j 4:08979e323c6e 256 // Calculate Temperature in decimal of grade centigrades i.e. 15.0 = 150.
jk431j 4:08979e323c6e 257 t_temp = (((int16_t)t_out - (int16_t)_T0_OUT) * deg) / ((int16_t)_T1_OUT - (int16_t)_T0_OUT);
jk431j 4:08979e323c6e 258 deg = ((int16_t)_T0_degC) / 8.0; // remove x8 multiple
jk431j 4:08979e323c6e 259 _temperature = deg + t_temp; // provide signed celsius measurement unit
jk431j 4:08979e323c6e 260 }
jk431j 4:08979e323c6e 261
jk431j 4:08979e323c6e 262 return _temperature;
jk431j 4:08979e323c6e 263 }