I added functionality to get the RSSI, BER, and Cell Neighbor for reporting connection issues to M2X

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

Committer:
ng977t
Date:
Thu Apr 18 22:58:31 2019 +0000
Revision:
13:99c72ab600c9
Parent:
12:0dfd0129f75d
I added functionality to get the RSSI, BER, and Cell Neighbor for reporting connection issues to M2X

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 "mbed.h"
jk431j 4:08979e323c6e 19 #include "sensors.h"
jk431j 4:08979e323c6e 20 #include "FXOS8700CQ.h"
jk431j 4:08979e323c6e 21 #include "HTS221.h"
ng977t 12:0dfd0129f75d 22 #include "WNCInterface.h"
jk431j 4:08979e323c6e 23 #include <string>
jk431j 4:08979e323c6e 24
jk431j 4:08979e323c6e 25 //I2C for pmod sensors:
jk431j 4:08979e323c6e 26 #define Si1145_PMOD_I2C_ADDR 0xC0 //this is for 7-bit addr 0x60 for the Si7020
jk431j 4:08979e323c6e 27 #define Si7020_PMOD_I2C_ADDR 0x80 //this is for 7-bit addr 0x4 for the Si7020
jk431j 4:08979e323c6e 28
jk431j 4:08979e323c6e 29 // Storage for the data from the motion sensor
jk431j 4:08979e323c6e 30 SRAWDATA accel_data;
jk431j 4:08979e323c6e 31 SRAWDATA magn_data;
jk431j 4:08979e323c6e 32 //InterruptIn fxos_int1(PTC6); // unused, common with SW2 on FRDM-K64F
jk431j 4:08979e323c6e 33 InterruptIn fxos_int2(PTC13); // should just be the Data-Ready interrupt
jk431j 4:08979e323c6e 34 bool fxos_int2_triggered = false;
jk431j 4:08979e323c6e 35 void trigger_fxos_int2(void)
jk431j 4:08979e323c6e 36 {
jk431j 4:08979e323c6e 37 fxos_int2_triggered = true;
jk431j 4:08979e323c6e 38
jk431j 4:08979e323c6e 39 }
jk431j 4:08979e323c6e 40
jk431j 4:08979e323c6e 41 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 42 * Perform I2C single read.
jk431j 4:08979e323c6e 43 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 44 unsigned char I2C_ReadSingleByte(unsigned char ucDeviceAddress)
jk431j 4:08979e323c6e 45 {
jk431j 4:08979e323c6e 46 char rxbuffer [1];
jk431j 4:08979e323c6e 47 i2c.read(ucDeviceAddress, rxbuffer, 1 );
jk431j 4:08979e323c6e 48 return (unsigned char)rxbuffer[0];
jk431j 4:08979e323c6e 49 } //I2C_ReadSingleByte()
jk431j 4:08979e323c6e 50
jk431j 4:08979e323c6e 51 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 52 * Perform I2C single read from address.
jk431j 4:08979e323c6e 53 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 54 unsigned char I2C_ReadSingleByteFromAddr(unsigned char ucDeviceAddress, unsigned char Addr)
jk431j 4:08979e323c6e 55 {
jk431j 4:08979e323c6e 56 char txbuffer [1];
jk431j 4:08979e323c6e 57 char rxbuffer [1];
jk431j 4:08979e323c6e 58 txbuffer[0] = (char)Addr;
jk431j 4:08979e323c6e 59 i2c.write(ucDeviceAddress, txbuffer, 1 );
jk431j 4:08979e323c6e 60 i2c.read(ucDeviceAddress, rxbuffer, 1 );
jk431j 4:08979e323c6e 61 return (unsigned char)rxbuffer[0];
jk431j 4:08979e323c6e 62 } //I2C_ReadSingleByteFromAddr()
jk431j 4:08979e323c6e 63
jk431j 4:08979e323c6e 64 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 65 * Perform I2C read of more than 1 byte.
jk431j 4:08979e323c6e 66 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 67 int I2C_ReadMultipleBytes(unsigned char ucDeviceAddress, char *ucData, unsigned char ucLength)
jk431j 4:08979e323c6e 68 {
jk431j 4:08979e323c6e 69 int status;
jk431j 4:08979e323c6e 70 status = i2c.read(ucDeviceAddress, ucData, ucLength);
jk431j 4:08979e323c6e 71 return status;
jk431j 4:08979e323c6e 72 } //I2C_ReadMultipleBytes()
jk431j 4:08979e323c6e 73
jk431j 4:08979e323c6e 74 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 75 * Perform I2C write of a single byte.
jk431j 4:08979e323c6e 76 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 77 int I2C_WriteSingleByte(unsigned char ucDeviceAddress, unsigned char Data, bool bSendStop)
jk431j 4:08979e323c6e 78 {
jk431j 4:08979e323c6e 79 int status;
jk431j 4:08979e323c6e 80 char txbuffer [1];
jk431j 4:08979e323c6e 81 txbuffer[0] = (char)Data; //data
jk431j 4:08979e323c6e 82 status = i2c.write(ucDeviceAddress, txbuffer, 1, !bSendStop); //true: do not send stop
jk431j 4:08979e323c6e 83 return status;
jk431j 4:08979e323c6e 84 } //I2C_WriteSingleByte()
jk431j 4:08979e323c6e 85
jk431j 4:08979e323c6e 86 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 87 * Perform I2C write of 1 byte to an address.
jk431j 4:08979e323c6e 88 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 89 int I2C_WriteSingleByteToAddr(unsigned char ucDeviceAddress, unsigned char Addr, unsigned char Data, bool bSendStop)
jk431j 4:08979e323c6e 90 {
jk431j 4:08979e323c6e 91 int status;
jk431j 4:08979e323c6e 92 char txbuffer [2];
jk431j 4:08979e323c6e 93 txbuffer[0] = (char)Addr; //address
jk431j 4:08979e323c6e 94 txbuffer[1] = (char)Data; //data
jk431j 4:08979e323c6e 95 //status = i2c.write(ucDeviceAddress, txbuffer, 2, false); //stop at end
jk431j 4:08979e323c6e 96 status = i2c.write(ucDeviceAddress, txbuffer, 2, !bSendStop); //true: do not send stop
jk431j 4:08979e323c6e 97 return status;
jk431j 4:08979e323c6e 98 } //I2C_WriteSingleByteToAddr()
jk431j 4:08979e323c6e 99
jk431j 4:08979e323c6e 100 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 101 * Perform I2C write of more than 1 byte.
jk431j 4:08979e323c6e 102 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 103 int I2C_WriteMultipleBytes(unsigned char ucDeviceAddress, char *ucData, unsigned char ucLength, bool bSendStop)
jk431j 4:08979e323c6e 104 {
jk431j 4:08979e323c6e 105 int status;
jk431j 4:08979e323c6e 106 status = i2c.write(ucDeviceAddress, ucData, ucLength, !bSendStop); //true: do not send stop
jk431j 4:08979e323c6e 107 return status;
jk431j 4:08979e323c6e 108 } //I2C_WriteMultipleBytes()
jk431j 4:08979e323c6e 109
jk431j 4:08979e323c6e 110 bool bSi7020_present = false;
jk431j 4:08979e323c6e 111 void Init_Si7020(void)
jk431j 4:08979e323c6e 112 {
jk431j 4:08979e323c6e 113 char SN_7020 [8];
jk431j 4:08979e323c6e 114 //SN part 1:
jk431j 4:08979e323c6e 115 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0xFA, 0x0F, false);
jk431j 4:08979e323c6e 116 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &SN_7020[0], 4);
jk431j 4:08979e323c6e 117
jk431j 4:08979e323c6e 118 //SN part 1:
jk431j 4:08979e323c6e 119 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0xFC, 0xC9, false);
jk431j 4:08979e323c6e 120 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &SN_7020[4], 4);
jk431j 4:08979e323c6e 121
jk431j 4:08979e323c6e 122 char Ver_7020 [2];
jk431j 4:08979e323c6e 123 //FW version:
jk431j 4:08979e323c6e 124 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0x84, 0xB8, false);
jk431j 4:08979e323c6e 125 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Ver_7020[0], 2);
jk431j 4:08979e323c6e 126
jk431j 4:08979e323c6e 127 if (SN_7020[4] != 0x14)
jk431j 4:08979e323c6e 128 {
jk431j 4:08979e323c6e 129 bSi7020_present = false;
jk431j 4:08979e323c6e 130 PRINTF("Si7020 sensor not found\r\n");
jk431j 4:08979e323c6e 131 }
jk431j 4:08979e323c6e 132 else
jk431j 4:08979e323c6e 133 {
jk431j 4:08979e323c6e 134 bSi7020_present = true;
jk431j 4:08979e323c6e 135 PRINTF("Si7020 SN = 0x%02X%02X%02X%02X%02X%02X%02X%02X\n", SN_7020[0], SN_7020[1], SN_7020[2], SN_7020[3], SN_7020[4], SN_7020[5], SN_7020[6], SN_7020[7]);
jk431j 4:08979e323c6e 136 PRINTF("Si7020 Version# = 0x%02X\n", Ver_7020[0]);
jk431j 4:08979e323c6e 137 } //bool bSi7020_present = true
jk431j 4:08979e323c6e 138
jk431j 4:08979e323c6e 139 } //Init_Si7020()
jk431j 4:08979e323c6e 140
jk431j 4:08979e323c6e 141 void Read_Si7020(void)
jk431j 4:08979e323c6e 142 {
jk431j 4:08979e323c6e 143 if (bSi7020_present)
jk431j 4:08979e323c6e 144 {
jk431j 4:08979e323c6e 145 char Humidity [2];
jk431j 4:08979e323c6e 146 char Temperature [2];
jk431j 4:08979e323c6e 147 //Command to measure humidity (temperature also gets measured):
jk431j 4:08979e323c6e 148 I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xF5, false); //no hold, must do dummy read
jk431j 4:08979e323c6e 149 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Humidity[0], 1); //dummy read, should get an nack until it is done
jk431j 4:08979e323c6e 150 wait (0.05); //wait for measurement. Can also keep reading until no NACK is received
jk431j 4:08979e323c6e 151 //I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xE5, false); //Hold mod, the device does a clock stretch on the read until it is done (crashes the I2C bus...
jk431j 4:08979e323c6e 152 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Humidity[0], 2); //read humidity
jk431j 4:08979e323c6e 153 //PRINTF("Read Si7020 Humidity = 0x%02X%02X\n", Humidity[0], Humidity[1]);
jk431j 4:08979e323c6e 154 int rh_code = (Humidity[0] << 8) + Humidity[1];
jk431j 4:08979e323c6e 155 float fRh = (125.0*rh_code/65536.0) - 6.0; //from datasheet
jk431j 5:8099493f2c35 156 SENSOR_DATA.Humidity_Si7020 = fRh;
jk431j 4:08979e323c6e 157
jk431j 4:08979e323c6e 158 //Command to read temperature when humidity is already done:
jk431j 4:08979e323c6e 159 I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xE0, false);
jk431j 4:08979e323c6e 160 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Temperature[0], 2); //read temperature
jk431j 4:08979e323c6e 161 //PRINTF("Read Si7020 Temperature = 0x%02X%02X\n", Temperature[0], Temperature[1]);
jk431j 4:08979e323c6e 162 int temp_code = (Temperature[0] << 8) + Temperature[1];
jk431j 4:08979e323c6e 163 float fTemp = (175.72*temp_code/65536.0) - 46.85; //from datasheet in Celcius
jk431j 5:8099493f2c35 164 SENSOR_DATA.Temperature_Si7020 = fTemp;
jk431j 4:08979e323c6e 165 } //bool bSi7020_present = true
jk431j 4:08979e323c6e 166
jk431j 4:08979e323c6e 167 } //Read_Si7020()
jk431j 4:08979e323c6e 168
jk431j 4:08979e323c6e 169 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 170 * The following are aliases so that the Si1145 coding examples can be used as-is.
jk431j 4:08979e323c6e 171 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 172 unsigned char ReadFrom_Si1145_Register(unsigned char reg) //returns byte from I2C Register 'reg'
jk431j 4:08979e323c6e 173 {
jk431j 4:08979e323c6e 174 unsigned char result = I2C_ReadSingleByteFromAddr(Si1145_PMOD_I2C_ADDR, reg);
jk431j 4:08979e323c6e 175 return (result);
jk431j 4:08979e323c6e 176 } //ReadFrom_Si1145_Register()
jk431j 4:08979e323c6e 177
jk431j 4:08979e323c6e 178 void WriteTo_Si1145_Register(unsigned char reg, unsigned char value) //writes 'value' into I2C Register reg'
jk431j 4:08979e323c6e 179 {
jk431j 4:08979e323c6e 180 I2C_WriteSingleByteToAddr(Si1145_PMOD_I2C_ADDR, reg, value, true);
jk431j 4:08979e323c6e 181 } //WriteTo_Si1145_Register()
jk431j 4:08979e323c6e 182
jk431j 4:08979e323c6e 183 #define REG_PARAM_WR 0x17
jk431j 4:08979e323c6e 184 #define REG_PARAM_RD 0x2E
jk431j 4:08979e323c6e 185 #define REG_COMMAND 0x18
jk431j 4:08979e323c6e 186 #define REG_RESPONSE 0x20
jk431j 4:08979e323c6e 187 #define REG_HW_KEY 0x07
jk431j 4:08979e323c6e 188 #define HW_KEY_VAL0 0x17
jk431j 4:08979e323c6e 189 #define REG_MEAS_RATE_LSB 0x08
jk431j 4:08979e323c6e 190 #define REG_MEAS_RATE_MSB 0x09
jk431j 4:08979e323c6e 191 #define REG_PS_LED21 0x0F
jk431j 4:08979e323c6e 192 #define REG_PS_LED3 0x10
jk431j 4:08979e323c6e 193 #define MAX_LED_CURRENT 0xF
jk431j 4:08979e323c6e 194 #define PARAM_CH_LIST 0x01
jk431j 4:08979e323c6e 195 #define REG_ALS_VIS_DATA0 0x22
jk431j 4:08979e323c6e 196 #define REG_ALS_VIS_DATA1 0x23
jk431j 4:08979e323c6e 197 #define REG_ALS_IR_DATA0 0x24
jk431j 4:08979e323c6e 198 #define REG_ALS_IR_DATA1 0x25
jk431j 4:08979e323c6e 199 #define REG_PS1_DATA0 0x26
jk431j 4:08979e323c6e 200 #define REG_PS1_DATA1 0x27
jk431j 4:08979e323c6e 201 #define REG_PS2_DATA0 0x28
jk431j 4:08979e323c6e 202 #define REG_PS2_DATA1 0x29
jk431j 4:08979e323c6e 203 #define REG_PS3_DATA0 0x2A
jk431j 4:08979e323c6e 204 #define REG_PS3_DATA1 0x2B
jk431j 4:08979e323c6e 205 #define REG_UVINDEX0 0x2C
jk431j 4:08979e323c6e 206 #define REG_UVINDEX1 0x2D
jk431j 4:08979e323c6e 207 int Si1145_ParamSet(unsigned char address, unsigned char value) //writes 'value' into Parameter 'address'
jk431j 4:08979e323c6e 208 {
jk431j 4:08979e323c6e 209 char txbuffer [3];
jk431j 4:08979e323c6e 210 txbuffer[0] = (char)REG_PARAM_WR; //destination
jk431j 4:08979e323c6e 211 txbuffer[1] = (char)value;
jk431j 4:08979e323c6e 212 txbuffer[2] = (char)(0xA0 + (address & 0x1F));
jk431j 4:08979e323c6e 213 int retval;
jk431j 4:08979e323c6e 214 //if((retval = _waitUntilSleep(si114x_handle))!=0) return retval;
jk431j 4:08979e323c6e 215 retval = I2C_WriteMultipleBytes(Si1145_PMOD_I2C_ADDR, &txbuffer[0], 3, true);
jk431j 4:08979e323c6e 216 if(retval!=0) return retval;
jk431j 4:08979e323c6e 217 while(1)
jk431j 4:08979e323c6e 218 {
jk431j 4:08979e323c6e 219 retval=ReadFrom_Si1145_Register(REG_PARAM_RD);
jk431j 4:08979e323c6e 220 if (retval==value) break;
jk431j 4:08979e323c6e 221 }
jk431j 4:08979e323c6e 222 return (0);
jk431j 4:08979e323c6e 223 } //Si1145_ParamSet()
jk431j 4:08979e323c6e 224
jk431j 4:08979e323c6e 225 void PsAlsForce(void) //equivalent to WriteTo_Si1145_Register(REG_COMMAND,0x07). This forces PS and ALS measurements
jk431j 4:08979e323c6e 226 {
jk431j 4:08979e323c6e 227 WriteTo_Si1145_Register(REG_COMMAND,0x07);
jk431j 4:08979e323c6e 228 } //PsAlsForce()
jk431j 4:08979e323c6e 229
jk431j 4:08979e323c6e 230 bool bSi1145_present = false;
jk431j 4:08979e323c6e 231 void Init_Si1145(void)
jk431j 4:08979e323c6e 232 {
jk431j 4:08979e323c6e 233 unsigned char readbyte;
jk431j 4:08979e323c6e 234 //Read Si1145 part ID:
jk431j 4:08979e323c6e 235 readbyte = ReadFrom_Si1145_Register(0x00);
jk431j 4:08979e323c6e 236 if (readbyte != 0x45)
jk431j 4:08979e323c6e 237 {
jk431j 4:08979e323c6e 238 bSi1145_present = false;
jk431j 4:08979e323c6e 239 PRINTF("Si1145 sensor not found\r\n");
jk431j 4:08979e323c6e 240 }
jk431j 4:08979e323c6e 241 else
jk431j 4:08979e323c6e 242 {
jk431j 4:08979e323c6e 243 bSi1145_present = true;
jk431j 4:08979e323c6e 244 PRINTF("Si1145 Part ID : 0x%02X\n", readbyte);
jk431j 4:08979e323c6e 245 //Initialize Si1145 by writing to HW_KEY (I2C Register 0x07 = 0x17)
jk431j 4:08979e323c6e 246 WriteTo_Si1145_Register(REG_HW_KEY, HW_KEY_VAL0);
jk431j 4:08979e323c6e 247
jk431j 4:08979e323c6e 248 // Initialize LED Current
jk431j 4:08979e323c6e 249 // I2C Register 0x0F = 0xFF
jk431j 4:08979e323c6e 250 // I2C Register 0x10 = 0x0F
jk431j 4:08979e323c6e 251 WriteTo_Si1145_Register(REG_PS_LED21,(MAX_LED_CURRENT<<4) + MAX_LED_CURRENT);
jk431j 4:08979e323c6e 252 WriteTo_Si1145_Register(REG_PS_LED3, MAX_LED_CURRENT);
jk431j 4:08979e323c6e 253
jk431j 4:08979e323c6e 254 // Parameter 0x01 = 0x37
jk431j 4:08979e323c6e 255 //Si1145_ParamSet(PARAM_CH_LIST, ALS_IR_TASK + ALS_VIS_TASK + PS1_TASK + PS2_TASK + PS3_TASK);
jk431j 4:08979e323c6e 256 //Si1145_ParamSet(0x01, 0x37); //CHLIST is address 0x01 in the parameter RAM. It defines which sensors are enabled (here, some)
jk431j 4:08979e323c6e 257 Si1145_ParamSet(0x01, 0x7F); //CHLIST is address 0x01 in the parameter RAM. It defines which sensors are enabled (here, all but UV. One can only use AUX or UV but here we use AUX because UV does not work...)
jk431j 4:08979e323c6e 258 // I2C Register 0x18 = 0x0x07 //This is PSALS_FORCE to the Command register => Force a single PS (proximity sensor) and ALS (ambient light sensor) reading - The factory code has this as 0x05 which only does PS...
jk431j 4:08979e323c6e 259 PsAlsForce(); // can also be written as WriteTo_Si1145_Register(REG_COMMAND,0x07);
jk431j 4:08979e323c6e 260 WriteTo_Si1145_Register(REG_COMMAND, 0x0F);//command to put it into auto mode
jk431j 4:08979e323c6e 261 //Set MES_RATE to 0x1000. I.e. the device will automatically wake up every 16 * 256* 31.25 us = 0.128 seconds to measure
jk431j 4:08979e323c6e 262 WriteTo_Si1145_Register(REG_MEAS_RATE_LSB, 0x00);
jk431j 4:08979e323c6e 263 WriteTo_Si1145_Register(REG_MEAS_RATE_MSB, 0x10);
jk431j 4:08979e323c6e 264 } //bSi1145_present = true
jk431j 4:08979e323c6e 265 } //Init_Si1145()
jk431j 4:08979e323c6e 266
jk431j 4:08979e323c6e 267 void Read_Si1145(void)
jk431j 4:08979e323c6e 268 {
jk431j 4:08979e323c6e 269 if (bSi1145_present)
jk431j 4:08979e323c6e 270 {
jk431j 4:08979e323c6e 271 // Once the measurements are completed, here is how to reconstruct them
jk431j 4:08979e323c6e 272 // Note very carefully that 16-bit registers are in the 'Little Endian' byte order
jk431j 4:08979e323c6e 273 // It may be more efficient to perform block I2C Reads, but this example shows
jk431j 4:08979e323c6e 274 // individual reads of registers
jk431j 4:08979e323c6e 275
jk431j 4:08979e323c6e 276 int PS1 = ReadFrom_Si1145_Register(REG_PS1_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS1_DATA1);
jk431j 4:08979e323c6e 277 int PS2 = ReadFrom_Si1145_Register(REG_PS2_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS2_DATA1);
jk431j 4:08979e323c6e 278 int PS3 = ReadFrom_Si1145_Register(REG_PS3_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS3_DATA1);
jk431j 4:08979e323c6e 279 //PRINTF("PS1_Data = %d\n", PS1);
jk431j 4:08979e323c6e 280 //PRINTF("PS2_Data = %d\n", PS2);
jk431j 4:08979e323c6e 281 //PRINTF("PS3_Data = %d\n", PS3);
jk431j 4:08979e323c6e 282 //OBJECT PRESENT?
jk431j 4:08979e323c6e 283 #if (0)
jk431j 4:08979e323c6e 284 if(PS1 < 22000){
jk431j 4:08979e323c6e 285 //PRINTF("Object Far\n");
jk431j 4:08979e323c6e 286 sprintf(SENSOR_DATA.Proximity, "Object Far\0");
jk431j 4:08979e323c6e 287 }
jk431j 4:08979e323c6e 288 else if(PS1 < 24000)
jk431j 4:08979e323c6e 289 {
jk431j 4:08979e323c6e 290 //PRINTF("Object in Vicinity\n");
jk431j 4:08979e323c6e 291 sprintf(SENSOR_DATA.Proximity, "Object in Vicinity\0");
jk431j 4:08979e323c6e 292 }
jk431j 4:08979e323c6e 293 else if (PS1 < 30000)
jk431j 4:08979e323c6e 294 {
jk431j 4:08979e323c6e 295 //PRINTF("Object Near\n");
jk431j 4:08979e323c6e 296 sprintf(SENSOR_DATA.Proximity, "Object Near\0");
jk431j 4:08979e323c6e 297 }
jk431j 4:08979e323c6e 298 else
jk431j 4:08979e323c6e 299 {
jk431j 4:08979e323c6e 300 //PRINTF("Object Very Near\n");
jk431j 4:08979e323c6e 301 sprintf(SENSOR_DATA.Proximity, "Object Very Near\0");
jk431j 4:08979e323c6e 302 }
jk431j 4:08979e323c6e 303 #else
jk431j 5:8099493f2c35 304 SENSOR_DATA.Proximity = PS1;
jk431j 4:08979e323c6e 305 #endif
jk431j 4:08979e323c6e 306
jk431j 4:08979e323c6e 307 //Force ALS read:
jk431j 4:08979e323c6e 308 //WriteTo_Si1145_Register(REG_COMMAND, 0x06);
jk431j 4:08979e323c6e 309 //wait (0.1);
jk431j 4:08979e323c6e 310 int ALS_VIS = ReadFrom_Si1145_Register(REG_ALS_VIS_DATA0) + 256 * ReadFrom_Si1145_Register(REG_ALS_VIS_DATA1);
jk431j 4:08979e323c6e 311 int ALS_IR = ReadFrom_Si1145_Register(REG_ALS_IR_DATA0) + 256 * ReadFrom_Si1145_Register(REG_ALS_IR_DATA1);
jk431j 4:08979e323c6e 312 int UV_INDEX = ReadFrom_Si1145_Register(REG_UVINDEX0) + 256 * ReadFrom_Si1145_Register(REG_UVINDEX1);
jk431j 4:08979e323c6e 313 //PRINTF("ALS_VIS_Data = %d\n", ALS_VIS);
jk431j 4:08979e323c6e 314 //PRINTF("ALS_IR_Data = %d\n", ALS_IR);
jk431j 4:08979e323c6e 315 //PRINTF("UV_INDEX_Data = %d\n", UV_INDEX);
jk431j 4:08979e323c6e 316
jk431j 4:08979e323c6e 317 //PRINTF("Ambient Light Visible Sensor = %d\n", ALS_VIS);
jk431j 5:8099493f2c35 318 SENSOR_DATA.AmbientLightVis = ALS_VIS;
jk431j 4:08979e323c6e 319 //PRINTF("Ambient Light Infrared Sensor = %d\n", ALS_IR);
jk431j 5:8099493f2c35 320 SENSOR_DATA.AmbientLightIr = ALS_IR;
jk431j 4:08979e323c6e 321 //float fUV_value = (UV_INDEX -50.0)/10000.0;
jk431j 4:08979e323c6e 322 float fUV_value = (UV_INDEX)/100.0; //this is the aux reading
jk431j 4:08979e323c6e 323 //PRINTF("UV_Data = %0.2f\n", fUV_value);
jk431j 5:8099493f2c35 324 SENSOR_DATA.UVindex = fUV_value;
jk431j 4:08979e323c6e 325 } //bSi1145_present = true
jk431j 4:08979e323c6e 326 } //Read_Si1145()
jk431j 4:08979e323c6e 327
jk431j 4:08979e323c6e 328 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 329 //* Read the FXOS8700CQ - 6-axis combo Sensor Accelerometer and Magnetometer
jk431j 4:08979e323c6e 330 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 331 bool bMotionSensor_present = false;
jk431j 4:08979e323c6e 332 void Init_motion_sensor()
jk431j 4:08979e323c6e 333 {
jk431j 4:08979e323c6e 334 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
jk431j 4:08979e323c6e 335 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
jk431j 4:08979e323c6e 336 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
jk431j 4:08979e323c6e 337 int iWhoAmI = fxos.get_whoami();
jk431j 4:08979e323c6e 338
jk431j 4:08979e323c6e 339 PRINTF("FXOS8700CQ WhoAmI = %X\r\n", iWhoAmI);
jk431j 4:08979e323c6e 340 // Iterrupt for active-low interrupt line from FXOS
jk431j 4:08979e323c6e 341 // Configured with only one interrupt on INT2 signaling Data-Ready
jk431j 4:08979e323c6e 342 //fxos_int2.fall(&trigger_fxos_int2);
jk431j 4:08979e323c6e 343 if (iWhoAmI != 0xC7)
jk431j 4:08979e323c6e 344 {
jk431j 4:08979e323c6e 345 bMotionSensor_present = false;
jk431j 4:08979e323c6e 346 PRINTF("FXOS8700CQ motion sensor not found\r\n");
jk431j 4:08979e323c6e 347 }
jk431j 4:08979e323c6e 348 else
jk431j 4:08979e323c6e 349 {
jk431j 4:08979e323c6e 350 bMotionSensor_present = true;
jk431j 4:08979e323c6e 351 fxos.enable();
jk431j 4:08979e323c6e 352 }
jk431j 4:08979e323c6e 353 } //Init_motion_sensor()
jk431j 4:08979e323c6e 354
jk431j 4:08979e323c6e 355 void Read_motion_sensor()
jk431j 4:08979e323c6e 356 {
jk431j 4:08979e323c6e 357 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
jk431j 4:08979e323c6e 358 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
jk431j 4:08979e323c6e 359 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
jk431j 4:08979e323c6e 360 if (bMotionSensor_present)
jk431j 4:08979e323c6e 361 {
jk431j 4:08979e323c6e 362 fxos.enable();
jk431j 4:08979e323c6e 363 fxos.get_data(&accel_data, &magn_data);
jk431j 4:08979e323c6e 364 //PRINTF("Roll=%5d, Pitch=%5d, Yaw=%5d;\r\n", magn_data.x, magn_data.y, magn_data.z);
jk431j 5:8099493f2c35 365 SENSOR_DATA.MagnetometerX = magn_data.x;
jk431j 5:8099493f2c35 366 SENSOR_DATA.MagnetometerY = magn_data.y;
jk431j 5:8099493f2c35 367 SENSOR_DATA.MagnetometerZ = magn_data.z;
jk431j 4:08979e323c6e 368
jk431j 4:08979e323c6e 369 //Try to normalize (/2048) the values so they will match the eCompass output:
jk431j 4:08979e323c6e 370 float fAccelScaled_x, fAccelScaled_y, fAccelScaled_z;
jk431j 4:08979e323c6e 371 fAccelScaled_x = (accel_data.x/2048.0);
jk431j 4:08979e323c6e 372 fAccelScaled_y = (accel_data.y/2048.0);
jk431j 4:08979e323c6e 373 fAccelScaled_z = (accel_data.z/2048.0);
jk431j 4:08979e323c6e 374 //PRINTF("Acc: X=%2.3f Y=%2.3f Z=%2.3f;\r\n", fAccelScaled_x, fAccelScaled_y, fAccelScaled_z);
jk431j 5:8099493f2c35 375 SENSOR_DATA.AccelX = fAccelScaled_x;
jk431j 5:8099493f2c35 376 SENSOR_DATA.AccelY = fAccelScaled_y;
jk431j 5:8099493f2c35 377 SENSOR_DATA.AccelZ = fAccelScaled_z;
jk431j 4:08979e323c6e 378 } //bMotionSensor_present
jk431j 4:08979e323c6e 379 } //Read_motion_sensor()
jk431j 4:08979e323c6e 380
jk431j 4:08979e323c6e 381
jk431j 4:08979e323c6e 382 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 383 //* Read the HTS221 temperature & humidity sensor on the Cellular Shield
jk431j 4:08979e323c6e 384 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 385 // These are to be built on the fly
jk431j 4:08979e323c6e 386 string my_temp;
jk431j 4:08979e323c6e 387 string my_humidity;
jk431j 4:08979e323c6e 388 HTS221 hts221;
jk431j 4:08979e323c6e 389
jk431j 4:08979e323c6e 390 #define CTOF(x) ((x)*1.8+32)
jk431j 4:08979e323c6e 391 bool bHTS221_present = false;
jk431j 4:08979e323c6e 392 void Init_HTS221()
jk431j 4:08979e323c6e 393 {
jk431j 4:08979e323c6e 394 int i;
jk431j 4:08979e323c6e 395 void hts221_init(void);
jk431j 4:08979e323c6e 396 i = hts221.begin();
jk431j 4:08979e323c6e 397 if (i)
jk431j 4:08979e323c6e 398 {
jk431j 4:08979e323c6e 399 bHTS221_present = true;
jk431j 4:08979e323c6e 400 PRINTF(BLU "HTS221 Detected (0x%02X)\n\r",i);
jk431j 4:08979e323c6e 401 PRINTF(" Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature()));
jk431j 4:08979e323c6e 402 PRINTF(" Humid is: %02d %%\n\r",hts221.readHumidity());
jk431j 4:08979e323c6e 403 }
jk431j 4:08979e323c6e 404 else
jk431j 4:08979e323c6e 405 {
jk431j 4:08979e323c6e 406 bHTS221_present = false;
jk431j 4:08979e323c6e 407 PRINTF(RED "HTS221 NOT DETECTED!\n\r");
jk431j 4:08979e323c6e 408 }
jk431j 4:08979e323c6e 409 } //Init_HTS221()
jk431j 4:08979e323c6e 410
jk431j 4:08979e323c6e 411 void Read_HTS221()
jk431j 4:08979e323c6e 412 {
jk431j 4:08979e323c6e 413 if (bHTS221_present)
jk431j 4:08979e323c6e 414 {
jk431j 4:08979e323c6e 415 double fTemp = hts221.readTemperature();
jk431j 4:08979e323c6e 416 double fRh = hts221.readHumidity();
jk431j 5:8099493f2c35 417 SENSOR_DATA.Temperature = fTemp;
jk431j 5:8099493f2c35 418 SENSOR_DATA.Humidity = fRh;
jk431j 4:08979e323c6e 419
jk431j 4:08979e323c6e 420 } //bHTS221_present
jk431j 4:08979e323c6e 421 } //Read_HTS221()
jk431j 4:08979e323c6e 422
ng977t 12:0dfd0129f75d 423 void Read_connection() // This function polls the K64F for signal strength in DBs(RSSI), Bit Error Rate, and gets the Neighboring Cell Tower's ID
ng977t 12:0dfd0129f75d 424 {
ng977t 12:0dfd0129f75d 425 using namespace WncControllerK64F_fk;
ng977t 12:0dfd0129f75d 426 WNCInterface eth;
ng977t 12:0dfd0129f75d 427 int16_t fRssi;
ng977t 12:0dfd0129f75d 428 fRssi = eth.getRSSI();
ng977t 12:0dfd0129f75d 429 SENSOR_DATA.Signal_Strength = fRssi;
ng977t 12:0dfd0129f75d 430 int16_t fBer;
ng977t 12:0dfd0129f75d 431 fBer = eth.get3gBer();
ng977t 12:0dfd0129f75d 432 SENSOR_DATA.Error = fBer;
ng977t 12:0dfd0129f75d 433 string * fN;
ng977t 12:0dfd0129f75d 434 fN = eth.readCellNeighbor_wnc();
ng977t 12:0dfd0129f75d 435 SENSOR_DATA.Neighbor = fN;
ng977t 12:0dfd0129f75d 436 }
jk431j 4:08979e323c6e 437 void sensors_init(void)
jk431j 4:08979e323c6e 438 {
jk431j 4:08979e323c6e 439 Init_HTS221();
jk431j 4:08979e323c6e 440 Init_Si7020();
jk431j 4:08979e323c6e 441 Init_Si1145();
jk431j 4:08979e323c6e 442 Init_motion_sensor();
jk431j 4:08979e323c6e 443 } //sensors_init
jk431j 4:08979e323c6e 444
jk431j 4:08979e323c6e 445 void read_sensors(void)
jk431j 4:08979e323c6e 446 {
jk431j 4:08979e323c6e 447 Read_HTS221();
jk431j 4:08979e323c6e 448 Read_Si7020();
jk431j 4:08979e323c6e 449 Read_Si1145();
jk431j 4:08979e323c6e 450 Read_motion_sensor();
ng977t 12:0dfd0129f75d 451 Read_connection();
jk431j 4:08979e323c6e 452 } //read_sensors
ng977t 12:0dfd0129f75d 453