Leon Wehmeier / Mbed OS fiasco_max32630

Dependencies:   SoftSerial MAX14690 Buffer

Fork of rtos_threading_with_callback by mbed_example

Committer:
lwehmeier
Date:
Sun Feb 25 16:40:28 2018 +0000
Revision:
2:bf699e054b34
changed to modular design; rtos support; BMI160, BMP180, SSD1306, MPU6050, DHT11, SD support implemented; bit stuffing for link layer implemented; priority queue for data transmission; high-priority SPI link layer output thread

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lwehmeier 2:bf699e054b34 1 /**********************************************************************
lwehmeier 2:bf699e054b34 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
lwehmeier 2:bf699e054b34 3 *
lwehmeier 2:bf699e054b34 4 * Permission is hereby granted, free of charge, to any person obtaining a
lwehmeier 2:bf699e054b34 5 * copy of this software and associated documentation files (the "Software"),
lwehmeier 2:bf699e054b34 6 * to deal in the Software without restriction, including without limitation
lwehmeier 2:bf699e054b34 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
lwehmeier 2:bf699e054b34 8 * and/or sell copies of the Software, and to permit persons to whom the
lwehmeier 2:bf699e054b34 9 * Software is furnished to do so, subject to the following conditions:
lwehmeier 2:bf699e054b34 10 *
lwehmeier 2:bf699e054b34 11 * The above copyright notice and this permission notice shall be included
lwehmeier 2:bf699e054b34 12 * in all copies or substantial portions of the Software.
lwehmeier 2:bf699e054b34 13 *
lwehmeier 2:bf699e054b34 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
lwehmeier 2:bf699e054b34 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
lwehmeier 2:bf699e054b34 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
lwehmeier 2:bf699e054b34 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
lwehmeier 2:bf699e054b34 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
lwehmeier 2:bf699e054b34 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
lwehmeier 2:bf699e054b34 20 * OTHER DEALINGS IN THE SOFTWARE.
lwehmeier 2:bf699e054b34 21 *
lwehmeier 2:bf699e054b34 22 * Except as contained in this notice, the name of Maxim Integrated
lwehmeier 2:bf699e054b34 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
lwehmeier 2:bf699e054b34 24 * Products, Inc. Branding Policy.
lwehmeier 2:bf699e054b34 25 *
lwehmeier 2:bf699e054b34 26 * The mere transfer of this software does not imply any licenses
lwehmeier 2:bf699e054b34 27 * of trade secrets, proprietary technology, copyrights, patents,
lwehmeier 2:bf699e054b34 28 * trademarks, maskwork rights, or any other form of intellectual
lwehmeier 2:bf699e054b34 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
lwehmeier 2:bf699e054b34 30 * ownership rights.
lwehmeier 2:bf699e054b34 31 **********************************************************************/
lwehmeier 2:bf699e054b34 32
lwehmeier 2:bf699e054b34 33
lwehmeier 2:bf699e054b34 34 #include "bmi160.h"
lwehmeier 2:bf699e054b34 35
lwehmeier 2:bf699e054b34 36
lwehmeier 2:bf699e054b34 37 const struct BMI160::AccConfig BMI160::DEFAULT_ACC_CONFIG = {SENS_2G,
lwehmeier 2:bf699e054b34 38 ACC_US_OFF,
lwehmeier 2:bf699e054b34 39 ACC_BWP_2,
lwehmeier 2:bf699e054b34 40 ACC_ODR_8};
lwehmeier 2:bf699e054b34 41
lwehmeier 2:bf699e054b34 42 const struct BMI160::GyroConfig BMI160::DEFAULT_GYRO_CONFIG = {DPS_2000,
lwehmeier 2:bf699e054b34 43 GYRO_BWP_2,
lwehmeier 2:bf699e054b34 44 GYRO_ODR_8};
lwehmeier 2:bf699e054b34 45
lwehmeier 2:bf699e054b34 46
lwehmeier 2:bf699e054b34 47 //*****************************************************************************
lwehmeier 2:bf699e054b34 48 int32_t BMI160::setSensorPowerMode(Sensors sensor, PowerModes pwrMode)
lwehmeier 2:bf699e054b34 49 {
lwehmeier 2:bf699e054b34 50 int32_t rtnVal = -1;
lwehmeier 2:bf699e054b34 51
lwehmeier 2:bf699e054b34 52 switch(sensor)
lwehmeier 2:bf699e054b34 53 {
lwehmeier 2:bf699e054b34 54 case MAG:
lwehmeier 2:bf699e054b34 55 rtnVal = writeRegister(CMD, (MAG_SET_PMU_MODE | pwrMode));
lwehmeier 2:bf699e054b34 56 break;
lwehmeier 2:bf699e054b34 57
lwehmeier 2:bf699e054b34 58 case GYRO:
lwehmeier 2:bf699e054b34 59 rtnVal = writeRegister(CMD, (GYR_SET_PMU_MODE | pwrMode));
lwehmeier 2:bf699e054b34 60 break;
lwehmeier 2:bf699e054b34 61
lwehmeier 2:bf699e054b34 62 case ACC:
lwehmeier 2:bf699e054b34 63 rtnVal = writeRegister(CMD, (ACC_SET_PMU_MODE | pwrMode));
lwehmeier 2:bf699e054b34 64 break;
lwehmeier 2:bf699e054b34 65
lwehmeier 2:bf699e054b34 66 default:
lwehmeier 2:bf699e054b34 67 rtnVal = -1;
lwehmeier 2:bf699e054b34 68 break;
lwehmeier 2:bf699e054b34 69 }
lwehmeier 2:bf699e054b34 70
lwehmeier 2:bf699e054b34 71 return rtnVal;
lwehmeier 2:bf699e054b34 72 }
lwehmeier 2:bf699e054b34 73
lwehmeier 2:bf699e054b34 74
lwehmeier 2:bf699e054b34 75 //*****************************************************************************
lwehmeier 2:bf699e054b34 76 int32_t BMI160::setSensorConfig(const AccConfig &config)
lwehmeier 2:bf699e054b34 77 {
lwehmeier 2:bf699e054b34 78 uint8_t data[2];
lwehmeier 2:bf699e054b34 79
lwehmeier 2:bf699e054b34 80 data[0] = ((config.us << ACC_US_POS) | (config.bwp << ACC_BWP_POS) |
lwehmeier 2:bf699e054b34 81 (config.odr << ACC_ODR_POS));
lwehmeier 2:bf699e054b34 82 data[1] = config.range;
lwehmeier 2:bf699e054b34 83
lwehmeier 2:bf699e054b34 84 return writeBlock(ACC_CONF, ACC_RANGE, data);
lwehmeier 2:bf699e054b34 85 }
lwehmeier 2:bf699e054b34 86
lwehmeier 2:bf699e054b34 87
lwehmeier 2:bf699e054b34 88 //*****************************************************************************
lwehmeier 2:bf699e054b34 89 int32_t BMI160::setSensorConfig(const GyroConfig &config)
lwehmeier 2:bf699e054b34 90 {
lwehmeier 2:bf699e054b34 91 uint8_t data[2];
lwehmeier 2:bf699e054b34 92
lwehmeier 2:bf699e054b34 93 data[0] = ((config.bwp << GYRO_BWP_POS) | (config.odr << GYRO_ODR_POS));
lwehmeier 2:bf699e054b34 94 data[1] = config.range;
lwehmeier 2:bf699e054b34 95
lwehmeier 2:bf699e054b34 96 return writeBlock(GYR_CONF, GYR_RANGE, data);
lwehmeier 2:bf699e054b34 97 }
lwehmeier 2:bf699e054b34 98
lwehmeier 2:bf699e054b34 99
lwehmeier 2:bf699e054b34 100 //*****************************************************************************
lwehmeier 2:bf699e054b34 101 int32_t BMI160::getSensorConfig(AccConfig &config)
lwehmeier 2:bf699e054b34 102 {
lwehmeier 2:bf699e054b34 103 uint8_t data[2];
lwehmeier 2:bf699e054b34 104 int32_t rtnVal = readBlock(ACC_CONF, ACC_RANGE, data);
lwehmeier 2:bf699e054b34 105
lwehmeier 2:bf699e054b34 106 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 107 {
lwehmeier 2:bf699e054b34 108 config.range = static_cast<BMI160::AccRange>(
lwehmeier 2:bf699e054b34 109 (data[1] & ACC_RANGE_MASK));
lwehmeier 2:bf699e054b34 110 config.us = static_cast<BMI160::AccUnderSampling>(
lwehmeier 2:bf699e054b34 111 ((data[0] & ACC_US_MASK) >> ACC_US_POS));
lwehmeier 2:bf699e054b34 112 config.bwp = static_cast<BMI160::AccBandWidthParam>(
lwehmeier 2:bf699e054b34 113 ((data[0] & ACC_BWP_MASK) >> ACC_BWP_POS));
lwehmeier 2:bf699e054b34 114 config.odr = static_cast<BMI160::AccOutputDataRate>(
lwehmeier 2:bf699e054b34 115 ((data[0] & ACC_ODR_MASK) >> ACC_ODR_POS));
lwehmeier 2:bf699e054b34 116 }
lwehmeier 2:bf699e054b34 117
lwehmeier 2:bf699e054b34 118 return rtnVal;
lwehmeier 2:bf699e054b34 119 }
lwehmeier 2:bf699e054b34 120
lwehmeier 2:bf699e054b34 121
lwehmeier 2:bf699e054b34 122 //*****************************************************************************
lwehmeier 2:bf699e054b34 123 int32_t BMI160::getSensorConfig(GyroConfig &config)
lwehmeier 2:bf699e054b34 124 {
lwehmeier 2:bf699e054b34 125 uint8_t data[2];
lwehmeier 2:bf699e054b34 126 int32_t rtnVal = readBlock(GYR_CONF, GYR_RANGE, data);
lwehmeier 2:bf699e054b34 127
lwehmeier 2:bf699e054b34 128 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 129 {
lwehmeier 2:bf699e054b34 130 config.range = static_cast<BMI160::GyroRange>(
lwehmeier 2:bf699e054b34 131 (data[1] & GYRO_RANGE_MASK));
lwehmeier 2:bf699e054b34 132 config.bwp = static_cast<BMI160::GyroBandWidthParam>(
lwehmeier 2:bf699e054b34 133 ((data[0] & GYRO_BWP_MASK) >> GYRO_BWP_POS));
lwehmeier 2:bf699e054b34 134 config.odr = static_cast<BMI160::GyroOutputDataRate>(
lwehmeier 2:bf699e054b34 135 ((data[0] & GYRO_ODR_MASK) >> GYRO_ODR_POS));
lwehmeier 2:bf699e054b34 136 }
lwehmeier 2:bf699e054b34 137
lwehmeier 2:bf699e054b34 138 return rtnVal;
lwehmeier 2:bf699e054b34 139 }
lwehmeier 2:bf699e054b34 140
lwehmeier 2:bf699e054b34 141
lwehmeier 2:bf699e054b34 142 //*****************************************************************************
lwehmeier 2:bf699e054b34 143 int32_t BMI160::getSensorAxis(SensorAxis axis, AxisData &data, AccRange range)
lwehmeier 2:bf699e054b34 144 {
lwehmeier 2:bf699e054b34 145 uint8_t localData[2];
lwehmeier 2:bf699e054b34 146 int32_t rtnVal;
lwehmeier 2:bf699e054b34 147
lwehmeier 2:bf699e054b34 148 switch(axis)
lwehmeier 2:bf699e054b34 149 {
lwehmeier 2:bf699e054b34 150 case X_AXIS:
lwehmeier 2:bf699e054b34 151 rtnVal = readBlock(DATA_14, DATA_15, localData);
lwehmeier 2:bf699e054b34 152 break;
lwehmeier 2:bf699e054b34 153
lwehmeier 2:bf699e054b34 154 case Y_AXIS:
lwehmeier 2:bf699e054b34 155 rtnVal = readBlock(DATA_16, DATA_17, localData);
lwehmeier 2:bf699e054b34 156 break;
lwehmeier 2:bf699e054b34 157
lwehmeier 2:bf699e054b34 158 case Z_AXIS:
lwehmeier 2:bf699e054b34 159 rtnVal = readBlock(DATA_18, DATA_19, localData);
lwehmeier 2:bf699e054b34 160 break;
lwehmeier 2:bf699e054b34 161
lwehmeier 2:bf699e054b34 162 default:
lwehmeier 2:bf699e054b34 163 rtnVal = -1;
lwehmeier 2:bf699e054b34 164 break;
lwehmeier 2:bf699e054b34 165 }
lwehmeier 2:bf699e054b34 166
lwehmeier 2:bf699e054b34 167 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 168 {
lwehmeier 2:bf699e054b34 169 data.raw = ((localData[1] << 8) | localData[0]);
lwehmeier 2:bf699e054b34 170 switch(range)
lwehmeier 2:bf699e054b34 171 {
lwehmeier 2:bf699e054b34 172 case SENS_2G:
lwehmeier 2:bf699e054b34 173 data.scaled = (data.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 174 break;
lwehmeier 2:bf699e054b34 175
lwehmeier 2:bf699e054b34 176 case SENS_4G:
lwehmeier 2:bf699e054b34 177 data.scaled = (data.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 178 break;
lwehmeier 2:bf699e054b34 179
lwehmeier 2:bf699e054b34 180 case SENS_8G:
lwehmeier 2:bf699e054b34 181 data.scaled = (data.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 182 break;
lwehmeier 2:bf699e054b34 183
lwehmeier 2:bf699e054b34 184 case SENS_16G:
lwehmeier 2:bf699e054b34 185 data.scaled = (data.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 186 break;
lwehmeier 2:bf699e054b34 187 }
lwehmeier 2:bf699e054b34 188 }
lwehmeier 2:bf699e054b34 189
lwehmeier 2:bf699e054b34 190 return rtnVal;
lwehmeier 2:bf699e054b34 191 }
lwehmeier 2:bf699e054b34 192
lwehmeier 2:bf699e054b34 193
lwehmeier 2:bf699e054b34 194 //*****************************************************************************
lwehmeier 2:bf699e054b34 195 int32_t BMI160::getSensorAxis(SensorAxis axis, AxisData &data, GyroRange range)
lwehmeier 2:bf699e054b34 196 {
lwehmeier 2:bf699e054b34 197 uint8_t localData[2];
lwehmeier 2:bf699e054b34 198 int32_t rtnVal;
lwehmeier 2:bf699e054b34 199
lwehmeier 2:bf699e054b34 200 switch(axis)
lwehmeier 2:bf699e054b34 201 {
lwehmeier 2:bf699e054b34 202 case X_AXIS:
lwehmeier 2:bf699e054b34 203 rtnVal = readBlock(DATA_8, DATA_9, localData);
lwehmeier 2:bf699e054b34 204 break;
lwehmeier 2:bf699e054b34 205
lwehmeier 2:bf699e054b34 206 case Y_AXIS:
lwehmeier 2:bf699e054b34 207 rtnVal = readBlock(DATA_10, DATA_11, localData);
lwehmeier 2:bf699e054b34 208 break;
lwehmeier 2:bf699e054b34 209
lwehmeier 2:bf699e054b34 210 case Z_AXIS:
lwehmeier 2:bf699e054b34 211 rtnVal = readBlock(DATA_12, DATA_13, localData);
lwehmeier 2:bf699e054b34 212 break;
lwehmeier 2:bf699e054b34 213
lwehmeier 2:bf699e054b34 214 default:
lwehmeier 2:bf699e054b34 215 rtnVal = -1;
lwehmeier 2:bf699e054b34 216 break;
lwehmeier 2:bf699e054b34 217 }
lwehmeier 2:bf699e054b34 218
lwehmeier 2:bf699e054b34 219 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 220 {
lwehmeier 2:bf699e054b34 221 data.raw = ((localData[1] << 8) | localData[0]);
lwehmeier 2:bf699e054b34 222 switch(range)
lwehmeier 2:bf699e054b34 223 {
lwehmeier 2:bf699e054b34 224 case DPS_2000:
lwehmeier 2:bf699e054b34 225 data.scaled = (data.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 226 break;
lwehmeier 2:bf699e054b34 227
lwehmeier 2:bf699e054b34 228 case DPS_1000:
lwehmeier 2:bf699e054b34 229 data.scaled = (data.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 230 break;
lwehmeier 2:bf699e054b34 231
lwehmeier 2:bf699e054b34 232 case DPS_500:
lwehmeier 2:bf699e054b34 233 data.scaled = (data.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 234 break;
lwehmeier 2:bf699e054b34 235
lwehmeier 2:bf699e054b34 236 case DPS_250:
lwehmeier 2:bf699e054b34 237 data.scaled = (data.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 238 break;
lwehmeier 2:bf699e054b34 239
lwehmeier 2:bf699e054b34 240 case DPS_125:
lwehmeier 2:bf699e054b34 241 data.scaled = (data.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 242 break;
lwehmeier 2:bf699e054b34 243 }
lwehmeier 2:bf699e054b34 244 }
lwehmeier 2:bf699e054b34 245
lwehmeier 2:bf699e054b34 246 return rtnVal;
lwehmeier 2:bf699e054b34 247 }
lwehmeier 2:bf699e054b34 248
lwehmeier 2:bf699e054b34 249
lwehmeier 2:bf699e054b34 250 //*****************************************************************************
lwehmeier 2:bf699e054b34 251 int32_t BMI160::getSensorXYZ(SensorData &data, AccRange range)
lwehmeier 2:bf699e054b34 252 {
lwehmeier 2:bf699e054b34 253 uint8_t localData[6];
lwehmeier 2:bf699e054b34 254 int32_t rtnVal = readBlock(DATA_14, DATA_19, localData);
lwehmeier 2:bf699e054b34 255
lwehmeier 2:bf699e054b34 256 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 257 {
lwehmeier 2:bf699e054b34 258 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
lwehmeier 2:bf699e054b34 259 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
lwehmeier 2:bf699e054b34 260 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
lwehmeier 2:bf699e054b34 261
lwehmeier 2:bf699e054b34 262 switch(range)
lwehmeier 2:bf699e054b34 263 {
lwehmeier 2:bf699e054b34 264 case SENS_2G:
lwehmeier 2:bf699e054b34 265 data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 266 data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 267 data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 268 break;
lwehmeier 2:bf699e054b34 269
lwehmeier 2:bf699e054b34 270 case SENS_4G:
lwehmeier 2:bf699e054b34 271 data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 272 data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 273 data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 274 break;
lwehmeier 2:bf699e054b34 275
lwehmeier 2:bf699e054b34 276 case SENS_8G:
lwehmeier 2:bf699e054b34 277 data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 278 data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 279 data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 280 break;
lwehmeier 2:bf699e054b34 281
lwehmeier 2:bf699e054b34 282 case SENS_16G:
lwehmeier 2:bf699e054b34 283 data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 284 data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 285 data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 286 break;
lwehmeier 2:bf699e054b34 287 }
lwehmeier 2:bf699e054b34 288 }
lwehmeier 2:bf699e054b34 289
lwehmeier 2:bf699e054b34 290 return rtnVal;
lwehmeier 2:bf699e054b34 291 }
lwehmeier 2:bf699e054b34 292
lwehmeier 2:bf699e054b34 293
lwehmeier 2:bf699e054b34 294 //*****************************************************************************
lwehmeier 2:bf699e054b34 295 int32_t BMI160::getSensorXYZ(SensorData &data, GyroRange range)
lwehmeier 2:bf699e054b34 296 {
lwehmeier 2:bf699e054b34 297 uint8_t localData[6];
lwehmeier 2:bf699e054b34 298 int32_t rtnVal = readBlock(DATA_8, DATA_13, localData);
lwehmeier 2:bf699e054b34 299
lwehmeier 2:bf699e054b34 300 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 301 {
lwehmeier 2:bf699e054b34 302 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
lwehmeier 2:bf699e054b34 303 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
lwehmeier 2:bf699e054b34 304 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
lwehmeier 2:bf699e054b34 305
lwehmeier 2:bf699e054b34 306 switch(range)
lwehmeier 2:bf699e054b34 307 {
lwehmeier 2:bf699e054b34 308 case DPS_2000:
lwehmeier 2:bf699e054b34 309 data.xAxis.scaled = (data.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 310 data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 311 data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 312 break;
lwehmeier 2:bf699e054b34 313
lwehmeier 2:bf699e054b34 314 case DPS_1000:
lwehmeier 2:bf699e054b34 315 data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 316 data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 317 data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 318 break;
lwehmeier 2:bf699e054b34 319
lwehmeier 2:bf699e054b34 320 case DPS_500:
lwehmeier 2:bf699e054b34 321 data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 322 data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 323 data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 324 break;
lwehmeier 2:bf699e054b34 325
lwehmeier 2:bf699e054b34 326 case DPS_250:
lwehmeier 2:bf699e054b34 327 data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 328 data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 329 data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 330 break;
lwehmeier 2:bf699e054b34 331
lwehmeier 2:bf699e054b34 332 case DPS_125:
lwehmeier 2:bf699e054b34 333 data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 334 data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 335 data.zAxis.scaled = (data.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 336 break;
lwehmeier 2:bf699e054b34 337 }
lwehmeier 2:bf699e054b34 338 }
lwehmeier 2:bf699e054b34 339
lwehmeier 2:bf699e054b34 340 return rtnVal;
lwehmeier 2:bf699e054b34 341 }
lwehmeier 2:bf699e054b34 342
lwehmeier 2:bf699e054b34 343
lwehmeier 2:bf699e054b34 344 //*****************************************************************************
lwehmeier 2:bf699e054b34 345 int32_t BMI160::getSensorXYZandSensorTime(SensorData &data,
lwehmeier 2:bf699e054b34 346 SensorTime &sensorTime,
lwehmeier 2:bf699e054b34 347 AccRange range)
lwehmeier 2:bf699e054b34 348 {
lwehmeier 2:bf699e054b34 349 uint8_t localData[9];
lwehmeier 2:bf699e054b34 350 int32_t rtnVal = readBlock(DATA_14, SENSORTIME_2, localData);
lwehmeier 2:bf699e054b34 351 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 352 {
lwehmeier 2:bf699e054b34 353 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
lwehmeier 2:bf699e054b34 354 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
lwehmeier 2:bf699e054b34 355 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
lwehmeier 2:bf699e054b34 356
lwehmeier 2:bf699e054b34 357 switch(range)
lwehmeier 2:bf699e054b34 358 {
lwehmeier 2:bf699e054b34 359 case SENS_2G:
lwehmeier 2:bf699e054b34 360 data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 361 data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 362 data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 363 break;
lwehmeier 2:bf699e054b34 364
lwehmeier 2:bf699e054b34 365 case SENS_4G:
lwehmeier 2:bf699e054b34 366 data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 367 data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 368 data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 369 break;
lwehmeier 2:bf699e054b34 370
lwehmeier 2:bf699e054b34 371 case SENS_8G:
lwehmeier 2:bf699e054b34 372 data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 373 data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 374 data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 375 break;
lwehmeier 2:bf699e054b34 376
lwehmeier 2:bf699e054b34 377 case SENS_16G:
lwehmeier 2:bf699e054b34 378 data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 379 data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 380 data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 381 break;
lwehmeier 2:bf699e054b34 382 }
lwehmeier 2:bf699e054b34 383
lwehmeier 2:bf699e054b34 384 sensorTime.raw = ((localData[8] << 16) | (localData[7] << 8) |
lwehmeier 2:bf699e054b34 385 localData[6]);
lwehmeier 2:bf699e054b34 386 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
lwehmeier 2:bf699e054b34 387 }
lwehmeier 2:bf699e054b34 388
lwehmeier 2:bf699e054b34 389 return rtnVal;
lwehmeier 2:bf699e054b34 390 }
lwehmeier 2:bf699e054b34 391
lwehmeier 2:bf699e054b34 392
lwehmeier 2:bf699e054b34 393 //*****************************************************************************
lwehmeier 2:bf699e054b34 394 int32_t BMI160::getSensorXYZandSensorTime(SensorData &data,
lwehmeier 2:bf699e054b34 395 SensorTime &sensorTime,
lwehmeier 2:bf699e054b34 396 GyroRange range)
lwehmeier 2:bf699e054b34 397 {
lwehmeier 2:bf699e054b34 398 uint8_t localData[16];
lwehmeier 2:bf699e054b34 399 int32_t rtnVal = readBlock(DATA_8, SENSORTIME_2, localData);
lwehmeier 2:bf699e054b34 400 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 401 {
lwehmeier 2:bf699e054b34 402 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
lwehmeier 2:bf699e054b34 403 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
lwehmeier 2:bf699e054b34 404 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
lwehmeier 2:bf699e054b34 405
lwehmeier 2:bf699e054b34 406 switch(range)
lwehmeier 2:bf699e054b34 407 {
lwehmeier 2:bf699e054b34 408 case DPS_2000:
lwehmeier 2:bf699e054b34 409 data.xAxis.scaled = (data.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 410 data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 411 data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 412 break;
lwehmeier 2:bf699e054b34 413
lwehmeier 2:bf699e054b34 414 case DPS_1000:
lwehmeier 2:bf699e054b34 415 data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 416 data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 417 data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 418 break;
lwehmeier 2:bf699e054b34 419
lwehmeier 2:bf699e054b34 420 case DPS_500:
lwehmeier 2:bf699e054b34 421 data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 422 data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 423 data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 424 break;
lwehmeier 2:bf699e054b34 425
lwehmeier 2:bf699e054b34 426 case DPS_250:
lwehmeier 2:bf699e054b34 427 data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 428 data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 429 data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 430 break;
lwehmeier 2:bf699e054b34 431
lwehmeier 2:bf699e054b34 432 case DPS_125:
lwehmeier 2:bf699e054b34 433 data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 434 data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 435 data.zAxis.scaled = (data.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 436 break;
lwehmeier 2:bf699e054b34 437 }
lwehmeier 2:bf699e054b34 438
lwehmeier 2:bf699e054b34 439 sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) |
lwehmeier 2:bf699e054b34 440 localData[12]);
lwehmeier 2:bf699e054b34 441 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
lwehmeier 2:bf699e054b34 442 }
lwehmeier 2:bf699e054b34 443
lwehmeier 2:bf699e054b34 444 return rtnVal;
lwehmeier 2:bf699e054b34 445 }
lwehmeier 2:bf699e054b34 446
lwehmeier 2:bf699e054b34 447
lwehmeier 2:bf699e054b34 448 //*****************************************************************************
lwehmeier 2:bf699e054b34 449 int32_t BMI160::getGyroAccXYZandSensorTime(SensorData &accData,
lwehmeier 2:bf699e054b34 450 SensorData &gyroData,
lwehmeier 2:bf699e054b34 451 SensorTime &sensorTime,
lwehmeier 2:bf699e054b34 452 AccRange accRange,
lwehmeier 2:bf699e054b34 453 GyroRange gyroRange)
lwehmeier 2:bf699e054b34 454 {
lwehmeier 2:bf699e054b34 455 uint8_t localData[16];
lwehmeier 2:bf699e054b34 456 int32_t rtnVal = readBlock(DATA_8, SENSORTIME_2, localData);
lwehmeier 2:bf699e054b34 457 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 458 {
lwehmeier 2:bf699e054b34 459 gyroData.xAxis.raw = ((localData[1] << 8) | localData[0]);
lwehmeier 2:bf699e054b34 460 gyroData.yAxis.raw = ((localData[3] << 8) | localData[2]);
lwehmeier 2:bf699e054b34 461 gyroData.zAxis.raw = ((localData[5] << 8) | localData[4]);
lwehmeier 2:bf699e054b34 462
lwehmeier 2:bf699e054b34 463 accData.xAxis.raw = ((localData[7] << 8) | localData[6]);
lwehmeier 2:bf699e054b34 464 accData.yAxis.raw = ((localData[9] << 8) | localData[8]);
lwehmeier 2:bf699e054b34 465 accData.zAxis.raw = ((localData[11] << 8) | localData[10]);
lwehmeier 2:bf699e054b34 466
lwehmeier 2:bf699e054b34 467 switch(gyroRange)
lwehmeier 2:bf699e054b34 468 {
lwehmeier 2:bf699e054b34 469 case DPS_2000:
lwehmeier 2:bf699e054b34 470 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 471 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 472 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 473 break;
lwehmeier 2:bf699e054b34 474
lwehmeier 2:bf699e054b34 475 case DPS_1000:
lwehmeier 2:bf699e054b34 476 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 477 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 478 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 479 break;
lwehmeier 2:bf699e054b34 480
lwehmeier 2:bf699e054b34 481 case DPS_500:
lwehmeier 2:bf699e054b34 482 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 483 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 484 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 485 break;
lwehmeier 2:bf699e054b34 486
lwehmeier 2:bf699e054b34 487 case DPS_250:
lwehmeier 2:bf699e054b34 488 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 489 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 490 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 491 break;
lwehmeier 2:bf699e054b34 492
lwehmeier 2:bf699e054b34 493 case DPS_125:
lwehmeier 2:bf699e054b34 494 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 495 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 496 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
lwehmeier 2:bf699e054b34 497 break;
lwehmeier 2:bf699e054b34 498 }
lwehmeier 2:bf699e054b34 499
lwehmeier 2:bf699e054b34 500 switch(accRange)
lwehmeier 2:bf699e054b34 501 {
lwehmeier 2:bf699e054b34 502 case SENS_2G:
lwehmeier 2:bf699e054b34 503 accData.xAxis.scaled = (accData.xAxis.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 504 accData.yAxis.scaled = (accData.yAxis.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 505 accData.zAxis.scaled = (accData.zAxis.raw/SENS_2G_LSB_PER_G);
lwehmeier 2:bf699e054b34 506 break;
lwehmeier 2:bf699e054b34 507
lwehmeier 2:bf699e054b34 508 case SENS_4G:
lwehmeier 2:bf699e054b34 509 accData.xAxis.scaled = (accData.xAxis.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 510 accData.yAxis.scaled = (accData.yAxis.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 511 accData.zAxis.scaled = (accData.zAxis.raw/SENS_4G_LSB_PER_G);
lwehmeier 2:bf699e054b34 512 break;
lwehmeier 2:bf699e054b34 513
lwehmeier 2:bf699e054b34 514 case SENS_8G:
lwehmeier 2:bf699e054b34 515 accData.xAxis.scaled = (accData.xAxis.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 516 accData.yAxis.scaled = (accData.yAxis.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 517 accData.zAxis.scaled = (accData.zAxis.raw/SENS_8G_LSB_PER_G);
lwehmeier 2:bf699e054b34 518 break;
lwehmeier 2:bf699e054b34 519
lwehmeier 2:bf699e054b34 520 case SENS_16G:
lwehmeier 2:bf699e054b34 521 accData.xAxis.scaled = (accData.xAxis.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 522 accData.yAxis.scaled = (accData.yAxis.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 523 accData.zAxis.scaled = (accData.zAxis.raw/SENS_16G_LSB_PER_G);
lwehmeier 2:bf699e054b34 524 break;
lwehmeier 2:bf699e054b34 525 }
lwehmeier 2:bf699e054b34 526
lwehmeier 2:bf699e054b34 527 sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) |
lwehmeier 2:bf699e054b34 528 localData[12]);
lwehmeier 2:bf699e054b34 529 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
lwehmeier 2:bf699e054b34 530 }
lwehmeier 2:bf699e054b34 531
lwehmeier 2:bf699e054b34 532 return rtnVal;
lwehmeier 2:bf699e054b34 533 }
lwehmeier 2:bf699e054b34 534
lwehmeier 2:bf699e054b34 535
lwehmeier 2:bf699e054b34 536 //*****************************************************************************
lwehmeier 2:bf699e054b34 537 int32_t BMI160::getSensorTime(SensorTime &sensorTime)
lwehmeier 2:bf699e054b34 538 {
lwehmeier 2:bf699e054b34 539 uint8_t localData[3];
lwehmeier 2:bf699e054b34 540 int32_t rtnVal = readBlock(SENSORTIME_0, SENSORTIME_2, localData);
lwehmeier 2:bf699e054b34 541
lwehmeier 2:bf699e054b34 542 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 543 {
lwehmeier 2:bf699e054b34 544 sensorTime.raw = ((localData[2] << 16) | (localData[1] << 8) |
lwehmeier 2:bf699e054b34 545 localData[0]);
lwehmeier 2:bf699e054b34 546 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
lwehmeier 2:bf699e054b34 547 }
lwehmeier 2:bf699e054b34 548
lwehmeier 2:bf699e054b34 549 return rtnVal;
lwehmeier 2:bf699e054b34 550 }
lwehmeier 2:bf699e054b34 551
lwehmeier 2:bf699e054b34 552
lwehmeier 2:bf699e054b34 553 //*****************************************************************************
lwehmeier 2:bf699e054b34 554 int32_t BMI160::getTemperature(float *temp)
lwehmeier 2:bf699e054b34 555 {
lwehmeier 2:bf699e054b34 556 uint8_t data[2];
lwehmeier 2:bf699e054b34 557 uint16_t rawTemp;
lwehmeier 2:bf699e054b34 558
lwehmeier 2:bf699e054b34 559 int32_t rtnVal = readBlock(TEMPERATURE_0, TEMPERATURE_1, data);
lwehmeier 2:bf699e054b34 560 if(rtnVal == RTN_NO_ERROR)
lwehmeier 2:bf699e054b34 561 {
lwehmeier 2:bf699e054b34 562 rawTemp = ((data[1] << 8) | data[0]);
lwehmeier 2:bf699e054b34 563 if(rawTemp & 0x8000)
lwehmeier 2:bf699e054b34 564 {
lwehmeier 2:bf699e054b34 565 *temp = (23.0F - ((0x10000 - rawTemp)/512.0F));
lwehmeier 2:bf699e054b34 566 }
lwehmeier 2:bf699e054b34 567 else
lwehmeier 2:bf699e054b34 568 {
lwehmeier 2:bf699e054b34 569 *temp = ((rawTemp/512.0F) + 23.0F);
lwehmeier 2:bf699e054b34 570 }
lwehmeier 2:bf699e054b34 571 }
lwehmeier 2:bf699e054b34 572
lwehmeier 2:bf699e054b34 573 return rtnVal;
lwehmeier 2:bf699e054b34 574 }