Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MotionSensor
FXOS8700Q/FXOS8700Q.cpp@29:6b8411bb040a, 2019-05-04 (annotated)
- Committer:
- el17sm
- Date:
- Sat May 04 15:39:20 2019 +0000
- Revision:
- 29:6b8411bb040a
- Parent:
- 0:8e92b66a0755
added Room complete;; started Floor engine;; ; To do:; Floor generation;; More enemies;; Bosses;; Title Screen;; Score;
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |