Steven Mahasin / Mbed 2 deprecated DreamDungeon

Dependencies:   mbed MotionSensor

Committer:
el17sm
Date:
Thu May 09 14:49:27 2019 +0000
Revision:
59:fd4669864b67
Parent:
30:ec915d24d3e9
wtf y no work

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17sm 0:8e92b66a0755 1 /* FXOS8700Q sensor driver
el17sm 0:8e92b66a0755 2 * Copyright (c) 2014-2015 ARM Limited
el17sm 0:8e92b66a0755 3 *
el17sm 0:8e92b66a0755 4 * Licensed under the Apache License, Version 2.0 (the "License");
el17sm 0:8e92b66a0755 5 * you may not use this file except in compliance with the License.
el17sm 0:8e92b66a0755 6 * You may obtain a copy of the License at
el17sm 0:8e92b66a0755 7 *
el17sm 0:8e92b66a0755 8 * http://www.apache.org/licenses/LICENSE-2.0
el17sm 0:8e92b66a0755 9 *
el17sm 0:8e92b66a0755 10 * Unless required by applicable law or agreed to in writing, software
el17sm 0:8e92b66a0755 11 * distributed under the License is distributed on an "AS IS" BASIS,
el17sm 0:8e92b66a0755 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
el17sm 0:8e92b66a0755 13 * See the License for the specific language governing permissions and
el17sm 0:8e92b66a0755 14 * limitations under the License.
el17sm 0:8e92b66a0755 15 */
el17sm 0:8e92b66a0755 16
el17sm 0:8e92b66a0755 17 #include "FXOS8700Q.h"
el17sm 0:8e92b66a0755 18
el17sm 0:8e92b66a0755 19 const uint16_t uint14_max = 0x3FFF;
el17sm 0:8e92b66a0755 20 void static inline normalize_14bits(int16_t &x)
el17sm 0:8e92b66a0755 21 {
el17sm 0:8e92b66a0755 22 x = ((x) > (uint14_max/2)) ? (x - uint14_max) : (x);
el17sm 0:8e92b66a0755 23 }
el17sm 0:8e92b66a0755 24
el17sm 0:8e92b66a0755 25 static int16_t dummy_int16_t = 0;
el17sm 0:8e92b66a0755 26 static float dummy_float = 0.0f;
el17sm 0:8e92b66a0755 27
el17sm 0:8e92b66a0755 28 FXOS8700Q::FXOS8700Q(I2C &i2c, uint8_t addr)
el17sm 0:8e92b66a0755 29 {
el17sm 0:8e92b66a0755 30 _i2c = &i2c;
el17sm 0:8e92b66a0755 31 _addr = addr;
el17sm 0:8e92b66a0755 32 // activate the peripheral
el17sm 0:8e92b66a0755 33 uint8_t data[2] = {FXOS8700Q_CTRL_REG1, 0x00};
el17sm 0:8e92b66a0755 34 _i2c->frequency(400000);
el17sm 0:8e92b66a0755 35 writeRegs(data, 2);
el17sm 0:8e92b66a0755 36 data[0] = FXOS8700Q_M_CTRL_REG1;
el17sm 0:8e92b66a0755 37 data[1] = 0x1F;
el17sm 0:8e92b66a0755 38 writeRegs(data, 2);
el17sm 0:8e92b66a0755 39 data[0] = FXOS8700Q_M_CTRL_REG2;
el17sm 0:8e92b66a0755 40 data[1] = 0x20;
el17sm 0:8e92b66a0755 41 writeRegs(data, 2);
el17sm 0:8e92b66a0755 42 data[0] = FXOS8700Q_XYZ_DATA_CFG;
el17sm 0:8e92b66a0755 43 data[1] = 0x00;
el17sm 0:8e92b66a0755 44 writeRegs(data, 2);
el17sm 0:8e92b66a0755 45 data[0] = FXOS8700Q_CTRL_REG1;
el17sm 0:8e92b66a0755 46 data[1] = 0x1C;
el17sm 0:8e92b66a0755 47 writeRegs(data, 2);
el17sm 0:8e92b66a0755 48 }
el17sm 0:8e92b66a0755 49
el17sm 0:8e92b66a0755 50 FXOS8700Q::~FXOS8700Q()
el17sm 0:8e92b66a0755 51 {
el17sm 0:8e92b66a0755 52 _i2c = 0;
el17sm 0:8e92b66a0755 53 _addr = 0;
el17sm 0:8e92b66a0755 54 }
el17sm 0:8e92b66a0755 55
el17sm 0:8e92b66a0755 56 void FXOS8700Q::readRegs(uint8_t addr, uint8_t *data, uint32_t len) const
el17sm 0:8e92b66a0755 57 {
el17sm 0:8e92b66a0755 58 uint8_t t[1] = {addr};
el17sm 0:8e92b66a0755 59 _i2c->write(_addr, (char *)t, sizeof(t), true);
el17sm 0:8e92b66a0755 60 _i2c->read(_addr, (char *)data, len);
el17sm 0:8e92b66a0755 61 }
el17sm 0:8e92b66a0755 62
el17sm 0:8e92b66a0755 63 uint8_t FXOS8700Q::whoAmI() const
el17sm 0:8e92b66a0755 64 {
el17sm 0:8e92b66a0755 65 uint8_t who_am_i = 0;
el17sm 0:8e92b66a0755 66 readRegs(FXOS8700Q_WHOAMI, &who_am_i, sizeof(who_am_i));
el17sm 0:8e92b66a0755 67 return who_am_i;
el17sm 0:8e92b66a0755 68 }
el17sm 0:8e92b66a0755 69
el17sm 0:8e92b66a0755 70 void FXOS8700Q::writeRegs(uint8_t * data, uint32_t len) const
el17sm 0:8e92b66a0755 71 {
el17sm 0:8e92b66a0755 72 _i2c->write(_addr, (char *)data, len);
el17sm 0:8e92b66a0755 73 }
el17sm 0:8e92b66a0755 74
el17sm 0:8e92b66a0755 75
el17sm 0:8e92b66a0755 76 int16_t FXOS8700Q::getSensorAxis(uint8_t addr) const
el17sm 0:8e92b66a0755 77 {
el17sm 0:8e92b66a0755 78 uint8_t res[2];
el17sm 0:8e92b66a0755 79 readRegs(addr, res, sizeof(res));
el17sm 0:8e92b66a0755 80 return static_cast<int16_t>((res[0] << 8) | res[1]);
el17sm 0:8e92b66a0755 81 }
el17sm 0:8e92b66a0755 82
el17sm 0:8e92b66a0755 83 void FXOS8700Q::enable(void) const
el17sm 0:8e92b66a0755 84 {
el17sm 0:8e92b66a0755 85 uint8_t data[2];
el17sm 0:8e92b66a0755 86 readRegs(FXOS8700Q_CTRL_REG1, &data[1], 1);
el17sm 0:8e92b66a0755 87 data[1] |= 0x01;
el17sm 0:8e92b66a0755 88 data[0] = FXOS8700Q_CTRL_REG1;
el17sm 0:8e92b66a0755 89 writeRegs(data, sizeof(data));
el17sm 0:8e92b66a0755 90 }
el17sm 0:8e92b66a0755 91
el17sm 0:8e92b66a0755 92 void FXOS8700Q::disable(void) const
el17sm 0:8e92b66a0755 93 {
el17sm 0:8e92b66a0755 94 uint8_t data[2];
el17sm 0:8e92b66a0755 95 readRegs(FXOS8700Q_CTRL_REG1, &data[1], 1);
el17sm 0:8e92b66a0755 96 data[1] &= 0xFE;
el17sm 0:8e92b66a0755 97 data[0] = FXOS8700Q_CTRL_REG1;
el17sm 0:8e92b66a0755 98 writeRegs(data, sizeof(data));
el17sm 0:8e92b66a0755 99 }
el17sm 0:8e92b66a0755 100
el17sm 0:8e92b66a0755 101 uint32_t FXOS8700Q::dataReady(void) const
el17sm 0:8e92b66a0755 102 {
el17sm 0:8e92b66a0755 103 uint8_t stat = 0;
el17sm 0:8e92b66a0755 104 readRegs(FXOS8700Q_STATUS, &stat, 1);
el17sm 0:8e92b66a0755 105 return (uint32_t)stat;
el17sm 0:8e92b66a0755 106 }
el17sm 0:8e92b66a0755 107
el17sm 0:8e92b66a0755 108 uint32_t FXOS8700Q::sampleRate(uint32_t frequency) const
el17sm 0:8e92b66a0755 109 {
el17sm 0:8e92b66a0755 110 return(50); // for now sample rate is fixed at 50Hz
el17sm 0:8e92b66a0755 111 }
el17sm 0:8e92b66a0755 112
el17sm 0:8e92b66a0755 113 int16_t FXOS8700QAccelerometer::getX(int16_t &x = dummy_int16_t) const
el17sm 0:8e92b66a0755 114 {
el17sm 0:8e92b66a0755 115 x = getSensorAxis(FXOS8700Q_OUT_X_MSB) >> 2;
el17sm 0:8e92b66a0755 116 normalize_14bits(x);
el17sm 0:8e92b66a0755 117 return x;
el17sm 0:8e92b66a0755 118 }
el17sm 0:8e92b66a0755 119
el17sm 0:8e92b66a0755 120 int16_t FXOS8700QAccelerometer::getY(int16_t &y = dummy_int16_t) const
el17sm 0:8e92b66a0755 121 {
el17sm 0:8e92b66a0755 122 y = getSensorAxis(FXOS8700Q_OUT_Y_MSB) >> 2;
el17sm 0:8e92b66a0755 123 normalize_14bits(y);
el17sm 0:8e92b66a0755 124 return y;
el17sm 0:8e92b66a0755 125 }
el17sm 0:8e92b66a0755 126
el17sm 0:8e92b66a0755 127 int16_t FXOS8700QAccelerometer::getZ(int16_t &z = dummy_int16_t) const
el17sm 0:8e92b66a0755 128 {
el17sm 0:8e92b66a0755 129 z = getSensorAxis(FXOS8700Q_OUT_Z_MSB) >> 2;
el17sm 0:8e92b66a0755 130 normalize_14bits(z);
el17sm 0:8e92b66a0755 131 return z;
el17sm 0:8e92b66a0755 132 }
el17sm 0:8e92b66a0755 133
el17sm 0:8e92b66a0755 134 float FXOS8700QAccelerometer::getX(float &x = dummy_float) const
el17sm 0:8e92b66a0755 135 {
el17sm 0:8e92b66a0755 136 int16_t val = getSensorAxis(FXOS8700Q_OUT_X_MSB) >> 2;
el17sm 0:8e92b66a0755 137 normalize_14bits(val);
el17sm 0:8e92b66a0755 138 x = val / 4096.0f;
el17sm 0:8e92b66a0755 139 return x;
el17sm 0:8e92b66a0755 140 }
el17sm 0:8e92b66a0755 141
el17sm 0:8e92b66a0755 142 float FXOS8700QAccelerometer::getY(float &y = dummy_float) const
el17sm 0:8e92b66a0755 143 {
el17sm 0:8e92b66a0755 144 int16_t val = getSensorAxis(FXOS8700Q_OUT_Y_MSB) >> 2;
el17sm 0:8e92b66a0755 145 normalize_14bits(val);
el17sm 0:8e92b66a0755 146 y = val / 4096.0f;
el17sm 0:8e92b66a0755 147 return y;
el17sm 0:8e92b66a0755 148 }
el17sm 0:8e92b66a0755 149
el17sm 0:8e92b66a0755 150 float FXOS8700QAccelerometer::getZ(float &z = dummy_float) const
el17sm 0:8e92b66a0755 151 {
el17sm 0:8e92b66a0755 152 int16_t val = getSensorAxis(FXOS8700Q_OUT_Z_MSB) >> 2;
el17sm 0:8e92b66a0755 153 normalize_14bits(val);
el17sm 0:8e92b66a0755 154 z = val / 4096.0f;
el17sm 0:8e92b66a0755 155 return z;
el17sm 0:8e92b66a0755 156 }
el17sm 0:8e92b66a0755 157
el17sm 0:8e92b66a0755 158 void FXOS8700QAccelerometer::getAxis(motion_data_counts_t &xyz) const
el17sm 0:8e92b66a0755 159 {
el17sm 0:8e92b66a0755 160 uint8_t res[6];
el17sm 0:8e92b66a0755 161 readRegs(FXOS8700Q_OUT_X_MSB, res, sizeof(res));
el17sm 0:8e92b66a0755 162 xyz.x = static_cast<int16_t>((res[0] << 8) | res[1]) >> 2;
el17sm 0:8e92b66a0755 163 xyz.y = static_cast<int16_t>((res[2] << 8) | res[3]) >> 2;
el17sm 0:8e92b66a0755 164 xyz.z = static_cast<int16_t>((res[4] << 8) | res[5]) >> 2;
el17sm 0:8e92b66a0755 165 normalize_14bits(xyz.x);
el17sm 0:8e92b66a0755 166 normalize_14bits(xyz.y);
el17sm 0:8e92b66a0755 167 normalize_14bits(xyz.z);
el17sm 0:8e92b66a0755 168 }
el17sm 0:8e92b66a0755 169
el17sm 0:8e92b66a0755 170 void FXOS8700QAccelerometer::getAxis(motion_data_units_t &xyz) const
el17sm 0:8e92b66a0755 171 {
el17sm 0:8e92b66a0755 172 motion_data_counts_t _xyz;
el17sm 0:8e92b66a0755 173 FXOS8700QAccelerometer::getAxis(_xyz);
el17sm 0:8e92b66a0755 174 xyz.x = _xyz.x / 4096.0f;
el17sm 0:8e92b66a0755 175 xyz.y = _xyz.y / 4096.0f;
el17sm 0:8e92b66a0755 176 xyz.z = _xyz.z / 4096.0f;
el17sm 0:8e92b66a0755 177 }
el17sm 0:8e92b66a0755 178
el17sm 0:8e92b66a0755 179 int16_t FXOS8700QMagnetometer::getX(int16_t &x = dummy_int16_t) const
el17sm 0:8e92b66a0755 180 {
el17sm 0:8e92b66a0755 181 x = getSensorAxis(FXOS8700Q_M_OUT_X_MSB);
el17sm 0:8e92b66a0755 182 return x;
el17sm 0:8e92b66a0755 183 }
el17sm 0:8e92b66a0755 184
el17sm 0:8e92b66a0755 185 int16_t FXOS8700QMagnetometer::getY(int16_t &y = dummy_int16_t) const
el17sm 0:8e92b66a0755 186 {
el17sm 0:8e92b66a0755 187 y = getSensorAxis(FXOS8700Q_M_OUT_Y_MSB);
el17sm 0:8e92b66a0755 188 return y;
el17sm 0:8e92b66a0755 189 }
el17sm 0:8e92b66a0755 190
el17sm 0:8e92b66a0755 191 int16_t FXOS8700QMagnetometer::getZ(int16_t &z = dummy_int16_t) const
el17sm 0:8e92b66a0755 192 {
el17sm 0:8e92b66a0755 193 z = getSensorAxis(FXOS8700Q_M_OUT_Z_MSB);
el17sm 0:8e92b66a0755 194 return z;
el17sm 0:8e92b66a0755 195 }
el17sm 0:8e92b66a0755 196
el17sm 0:8e92b66a0755 197 float FXOS8700QMagnetometer::getX(float &x = dummy_float) const
el17sm 0:8e92b66a0755 198 {
el17sm 0:8e92b66a0755 199 x = static_cast<float>(getSensorAxis(FXOS8700Q_M_OUT_X_MSB)) * 0.1f;
el17sm 0:8e92b66a0755 200 return x;
el17sm 0:8e92b66a0755 201 }
el17sm 0:8e92b66a0755 202
el17sm 0:8e92b66a0755 203 float FXOS8700QMagnetometer::getY(float &y = dummy_float) const
el17sm 0:8e92b66a0755 204 {
el17sm 0:8e92b66a0755 205 y = static_cast<float>(getSensorAxis(FXOS8700Q_M_OUT_Y_MSB)) * 0.1f;
el17sm 0:8e92b66a0755 206 return y;
el17sm 0:8e92b66a0755 207 }
el17sm 0:8e92b66a0755 208
el17sm 0:8e92b66a0755 209 float FXOS8700QMagnetometer::getZ(float &z = dummy_float) const
el17sm 0:8e92b66a0755 210 {
el17sm 0:8e92b66a0755 211 z = static_cast<float>(getSensorAxis(FXOS8700Q_M_OUT_Z_MSB)) * 0.1f;
el17sm 0:8e92b66a0755 212 return z;
el17sm 0:8e92b66a0755 213 }
el17sm 0:8e92b66a0755 214
el17sm 0:8e92b66a0755 215 void FXOS8700QMagnetometer::getAxis(motion_data_counts_t &xyz) const
el17sm 0:8e92b66a0755 216 {
el17sm 0:8e92b66a0755 217 uint8_t res[6];
el17sm 0:8e92b66a0755 218 readRegs(FXOS8700Q_M_OUT_X_MSB, res, sizeof(res));
el17sm 0:8e92b66a0755 219 xyz.x = (res[0] << 8) | res[1];
el17sm 0:8e92b66a0755 220 xyz.y = (res[2] << 8) | res[3];
el17sm 0:8e92b66a0755 221 xyz.z = (res[4] << 8) | res[5];
el17sm 0:8e92b66a0755 222 }
el17sm 0:8e92b66a0755 223
el17sm 0:8e92b66a0755 224 void FXOS8700QMagnetometer::getAxis(motion_data_units_t &xyz) const
el17sm 0:8e92b66a0755 225 {
el17sm 0:8e92b66a0755 226 motion_data_counts_t _xyz;
el17sm 0:8e92b66a0755 227 FXOS8700QMagnetometer::getAxis(_xyz);
el17sm 0:8e92b66a0755 228 xyz.x = static_cast<float>(_xyz.x * 0.1f);
el17sm 0:8e92b66a0755 229 xyz.y = static_cast<float>(_xyz.y * 0.1f);
el17sm 0:8e92b66a0755 230 xyz.z = static_cast<float>(_xyz.z * 0.1f);
el17sm 0:8e92b66a0755 231 }