![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Version FC
Dependencies: DmTftLibrary eeprom SX1280Lib filesystem mbed
Fork of MSNV2-Terminal_V1-5 by
COMPONENTS/lsm303d_component.hpp@26:271d2d510f6c, 2018-09-18 (annotated)
- Committer:
- lo
- Date:
- Tue Sep 18 19:41:38 2018 +0000
- Revision:
- 26:271d2d510f6c
- Child:
- 31:2b8b98f3feed
added components implementations
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lo | 26:271d2d510f6c | 1 | /* |
lo | 26:271d2d510f6c | 2 | * lsm303d_component.hpp |
lo | 26:271d2d510f6c | 3 | * |
lo | 26:271d2d510f6c | 4 | * Created on: 18 sept. 2018 |
lo | 26:271d2d510f6c | 5 | * Author: hoel |
lo | 26:271d2d510f6c | 6 | */ |
lo | 26:271d2d510f6c | 7 | |
lo | 26:271d2d510f6c | 8 | #ifndef COMPONENTS_LSM303D_COMPONENT_HPP_ |
lo | 26:271d2d510f6c | 9 | #define COMPONENTS_LSM303D_COMPONENT_HPP_ |
lo | 26:271d2d510f6c | 10 | |
lo | 26:271d2d510f6c | 11 | #include <iostream> |
lo | 26:271d2d510f6c | 12 | #include <cstdlib> |
lo | 26:271d2d510f6c | 13 | #include "mbed.h" |
lo | 26:271d2d510f6c | 14 | #include "Context.h" |
lo | 26:271d2d510f6c | 15 | #include "Service.hpp" |
lo | 26:271d2d510f6c | 16 | #include "Component.hpp" |
lo | 26:271d2d510f6c | 17 | |
lo | 26:271d2d510f6c | 18 | using namespace std; |
lo | 26:271d2d510f6c | 19 | using namespace misnet; |
lo | 26:271d2d510f6c | 20 | |
lo | 26:271d2d510f6c | 21 | #define MAG_ADDRESS 0x3C |
lo | 26:271d2d510f6c | 22 | #define ACC_ADDRESS 0x32 |
lo | 26:271d2d510f6c | 23 | |
lo | 26:271d2d510f6c | 24 | #define CTRL_REG1_A 0x20 |
lo | 26:271d2d510f6c | 25 | #define CTRL_REG2_A 0x21 |
lo | 26:271d2d510f6c | 26 | #define CTRL_REG3_A 0x22 |
lo | 26:271d2d510f6c | 27 | #define CTRL_REG4_A 0x23 |
lo | 26:271d2d510f6c | 28 | #define CTRL_REG5_A 0x24 |
lo | 26:271d2d510f6c | 29 | #define CTRL_REG6_A 0x25 // DLHC only |
lo | 26:271d2d510f6c | 30 | #define REFERENCE_A 0x26 |
lo | 26:271d2d510f6c | 31 | #define STATUS_REG_A 0x27 |
lo | 26:271d2d510f6c | 32 | |
lo | 26:271d2d510f6c | 33 | #define OUT_X_L_A 0x28 |
lo | 26:271d2d510f6c | 34 | #define OUT_X_H_A 0x29 |
lo | 26:271d2d510f6c | 35 | #define OUT_Y_L_A 0x2A |
lo | 26:271d2d510f6c | 36 | #define OUT_Y_H_A 0x2B |
lo | 26:271d2d510f6c | 37 | #define OUT_Z_L_A 0x2C |
lo | 26:271d2d510f6c | 38 | #define OUT_Z_H_A 0x2D |
lo | 26:271d2d510f6c | 39 | |
lo | 26:271d2d510f6c | 40 | #define INT1_CFG_A 0x30 |
lo | 26:271d2d510f6c | 41 | #define INT1_SRC_A 0x31 |
lo | 26:271d2d510f6c | 42 | #define INT1_THS_A 0x32 |
lo | 26:271d2d510f6c | 43 | #define INT1_DURATION_A 0x33 |
lo | 26:271d2d510f6c | 44 | #define INT2_CFG_A 0x34 |
lo | 26:271d2d510f6c | 45 | #define INT2_SRC_A 0x35 |
lo | 26:271d2d510f6c | 46 | #define INT2_THS_A 0x36 |
lo | 26:271d2d510f6c | 47 | #define INT2_DURATION_A 0x37 |
lo | 26:271d2d510f6c | 48 | |
lo | 26:271d2d510f6c | 49 | #define CRA_REG_M 0x00 |
lo | 26:271d2d510f6c | 50 | #define CRB_REG_M 0x01 |
lo | 26:271d2d510f6c | 51 | #define MR_REG_M 0x02 |
lo | 26:271d2d510f6c | 52 | |
lo | 26:271d2d510f6c | 53 | #define OUT_X_H_M 0x03 |
lo | 26:271d2d510f6c | 54 | #define OUT_X_L_M 0x04 |
lo | 26:271d2d510f6c | 55 | #define OUT_Y_H_M 0x07 |
lo | 26:271d2d510f6c | 56 | #define OUT_Y_L_M 0x08 |
lo | 26:271d2d510f6c | 57 | #define OUT_Z_H_M 0x05 |
lo | 26:271d2d510f6c | 58 | #define OUT_Z_L_M 0x06 |
lo | 26:271d2d510f6c | 59 | |
lo | 26:271d2d510f6c | 60 | #define SR_REG_M 0x09 |
lo | 26:271d2d510f6c | 61 | #define IRA_REG_M 0x0A |
lo | 26:271d2d510f6c | 62 | #define IRB_REG_M 0x0B |
lo | 26:271d2d510f6c | 63 | #define IRC_REG_M 0x0C |
lo | 26:271d2d510f6c | 64 | |
lo | 26:271d2d510f6c | 65 | class LSM303DLHC_component : public Component{ |
lo | 26:271d2d510f6c | 66 | |
lo | 26:271d2d510f6c | 67 | public: |
lo | 26:271d2d510f6c | 68 | LSM303DLHC_component(COMPONENT_ID id, vector<Service*>& services, PinName sda, PinName scl): |
lo | 26:271d2d510f6c | 69 | _device(sda, scl) |
lo | 26:271d2d510f6c | 70 | { |
lo | 26:271d2d510f6c | 71 | this->setServices(services); |
lo | 26:271d2d510f6c | 72 | this->setId(id); |
lo | 26:271d2d510f6c | 73 | _device.frequency(400000); |
lo | 26:271d2d510f6c | 74 | } |
lo | 26:271d2d510f6c | 75 | ~LSM303DLHC_component(); |
lo | 26:271d2d510f6c | 76 | void init(){ |
lo | 26:271d2d510f6c | 77 | // init mag |
lo | 26:271d2d510f6c | 78 | // continuous conversion mode |
lo | 26:271d2d510f6c | 79 | _data[0] = MR_REG_M; |
lo | 26:271d2d510f6c | 80 | _data[1] = 0x00; |
lo | 26:271d2d510f6c | 81 | _device.write(MAG_ADDRESS, _data, 2); |
lo | 26:271d2d510f6c | 82 | // data rate 75hz |
lo | 26:271d2d510f6c | 83 | _data[0] = CRA_REG_M; |
lo | 26:271d2d510f6c | 84 | _data[1] = 0x18; // 0b00011000 |
lo | 26:271d2d510f6c | 85 | _device.write(MAG_ADDRESS, _data, 2); |
lo | 26:271d2d510f6c | 86 | // init acc |
lo | 26:271d2d510f6c | 87 | // data rate 100hz |
lo | 26:271d2d510f6c | 88 | _data[0] = CTRL_REG1_A; |
lo | 26:271d2d510f6c | 89 | _data[1] = 0x2F; // 0b00101111 |
lo | 26:271d2d510f6c | 90 | _device.write(ACC_ADDRESS, _data, 2); |
lo | 26:271d2d510f6c | 91 | } |
lo | 26:271d2d510f6c | 92 | |
lo | 26:271d2d510f6c | 93 | private: |
lo | 26:271d2d510f6c | 94 | void setScale(float x, float y, float z){ |
lo | 26:271d2d510f6c | 95 | scale[0] = x; |
lo | 26:271d2d510f6c | 96 | scale[1] = y; |
lo | 26:271d2d510f6c | 97 | scale[2] = z; |
lo | 26:271d2d510f6c | 98 | } |
lo | 26:271d2d510f6c | 99 | void setOffset(float x, float y, float z){ |
lo | 26:271d2d510f6c | 100 | offset[0] = x; |
lo | 26:271d2d510f6c | 101 | offset[1] = y; |
lo | 26:271d2d510f6c | 102 | offset[2] = z; |
lo | 26:271d2d510f6c | 103 | } |
lo | 26:271d2d510f6c | 104 | |
lo | 26:271d2d510f6c | 105 | I2C _device; |
lo | 26:271d2d510f6c | 106 | char _data[6]; |
lo | 26:271d2d510f6c | 107 | int offset[3], scale[3]; |
lo | 26:271d2d510f6c | 108 | |
lo | 26:271d2d510f6c | 109 | class LSM303DLHC_accelerometer : public Service{ |
lo | 26:271d2d510f6c | 110 | |
lo | 26:271d2d510f6c | 111 | public: |
lo | 26:271d2d510f6c | 112 | LSM303DLHC_accelerometer( |
lo | 26:271d2d510f6c | 113 | DEVICE_TYPE type, |
lo | 26:271d2d510f6c | 114 | MISNET_CODE misnet_code, |
lo | 26:271d2d510f6c | 115 | STATE state, |
lo | 26:271d2d510f6c | 116 | ACCESS_TYPE access_type, |
lo | 26:271d2d510f6c | 117 | REQUEST_MODE request_mode, |
lo | 26:271d2d510f6c | 118 | UP_MODE up_mode, |
lo | 26:271d2d510f6c | 119 | ACCESS_PIN access_pins[6], |
lo | 26:271d2d510f6c | 120 | uint32_t subsample_rate, |
lo | 26:271d2d510f6c | 121 | ACTION action, |
lo | 26:271d2d510f6c | 122 | OUTPUT_MODE output_mode, |
lo | 26:271d2d510f6c | 123 | string comment, |
lo | 26:271d2d510f6c | 124 | LSM303DLHC_component* parent |
lo | 26:271d2d510f6c | 125 | ) |
lo | 26:271d2d510f6c | 126 | { |
lo | 26:271d2d510f6c | 127 | this->parent = parent; |
lo | 26:271d2d510f6c | 128 | this->setDeviceType(type); |
lo | 26:271d2d510f6c | 129 | this->setMisnetCode(misnet_code); |
lo | 26:271d2d510f6c | 130 | this->setState(state); |
lo | 26:271d2d510f6c | 131 | this->setAccessType(access_type); |
lo | 26:271d2d510f6c | 132 | this->setRequestMode(request_mode); |
lo | 26:271d2d510f6c | 133 | this->setUpMode(up_mode); |
lo | 26:271d2d510f6c | 134 | this->setAction(action); |
lo | 26:271d2d510f6c | 135 | this->setOutputMode(output_mode); |
lo | 26:271d2d510f6c | 136 | this->setComment(comment); |
lo | 26:271d2d510f6c | 137 | this->setSubsampleRate(subsample_rate); |
lo | 26:271d2d510f6c | 138 | } |
lo | 26:271d2d510f6c | 139 | virtual ~LSM303DLHC_accelerometer() {} |
lo | 26:271d2d510f6c | 140 | int* readValue(void) { |
lo | 26:271d2d510f6c | 141 | int a[3]; |
lo | 26:271d2d510f6c | 142 | parent->_data[0] = OUT_X_L_A | (1<<7); |
lo | 26:271d2d510f6c | 143 | parent->_device.write(ACC_ADDRESS, _data, 1); |
lo | 26:271d2d510f6c | 144 | parent->_device.read(ACC_ADDRESS, _data, 6); |
lo | 26:271d2d510f6c | 145 | |
lo | 26:271d2d510f6c | 146 | // 12-bit values |
lo | 26:271d2d510f6c | 147 | a[0] = (short)(parent->_data[1]<<8 | parent->_data[0]) >> 4; |
lo | 26:271d2d510f6c | 148 | a[1] = (short)(parent->_data[3]<<8 | parent->_data[2]) >> 4; |
lo | 26:271d2d510f6c | 149 | a[2] = (short)(parent->_data[5]<<8 | parent->_data[4]) >> 4; |
lo | 26:271d2d510f6c | 150 | return a; |
lo | 26:271d2d510f6c | 151 | } |
lo | 26:271d2d510f6c | 152 | |
lo | 26:271d2d510f6c | 153 | private: |
lo | 26:271d2d510f6c | 154 | LSM303DLHC_component *parent; |
lo | 26:271d2d510f6c | 155 | }; |
lo | 26:271d2d510f6c | 156 | |
lo | 26:271d2d510f6c | 157 | class LSM303DLHC_megnetometer : public Service{ |
lo | 26:271d2d510f6c | 158 | |
lo | 26:271d2d510f6c | 159 | public: |
lo | 26:271d2d510f6c | 160 | LSM303DLHC_megnetometer( |
lo | 26:271d2d510f6c | 161 | DEVICE_TYPE type, |
lo | 26:271d2d510f6c | 162 | MISNET_CODE misnet_code, |
lo | 26:271d2d510f6c | 163 | STATE state, |
lo | 26:271d2d510f6c | 164 | ACCESS_TYPE access_type, |
lo | 26:271d2d510f6c | 165 | REQUEST_MODE request_mode, |
lo | 26:271d2d510f6c | 166 | UP_MODE up_mode, |
lo | 26:271d2d510f6c | 167 | ACCESS_PIN access_pins[6], |
lo | 26:271d2d510f6c | 168 | uint32_t subsample_rate, |
lo | 26:271d2d510f6c | 169 | ACTION action, |
lo | 26:271d2d510f6c | 170 | OUTPUT_MODE output_mode, |
lo | 26:271d2d510f6c | 171 | string comment, |
lo | 26:271d2d510f6c | 172 | LSM303DLHC_component* parent |
lo | 26:271d2d510f6c | 173 | ) |
lo | 26:271d2d510f6c | 174 | { |
lo | 26:271d2d510f6c | 175 | this->parent = parent; |
lo | 26:271d2d510f6c | 176 | this->setDeviceType(type); |
lo | 26:271d2d510f6c | 177 | this->setMisnetCode(misnet_code); |
lo | 26:271d2d510f6c | 178 | this->setState(state); |
lo | 26:271d2d510f6c | 179 | this->setAccessType(access_type); |
lo | 26:271d2d510f6c | 180 | this->setRequestMode(request_mode); |
lo | 26:271d2d510f6c | 181 | this->setUpMode(up_mode); |
lo | 26:271d2d510f6c | 182 | this->setAction(action); |
lo | 26:271d2d510f6c | 183 | this->setOutputMode(output_mode); |
lo | 26:271d2d510f6c | 184 | this->setComment(comment); |
lo | 26:271d2d510f6c | 185 | this->setSubsampleRate(subsample_rate); |
lo | 26:271d2d510f6c | 186 | } |
lo | 26:271d2d510f6c | 187 | virtual ~LSM303DLHC_megnetometer() {} |
lo | 26:271d2d510f6c | 188 | int* readValue(void) { |
lo | 26:271d2d510f6c | 189 | int a[3]; |
lo | 26:271d2d510f6c | 190 | parent->_data[0] = OUT_X_H_M; |
lo | 26:271d2d510f6c | 191 | parent->_device.write(MAG_ADDRESS, parent->_data, 1); |
lo | 26:271d2d510f6c | 192 | parent->_device.read(MAG_ADDRESS, parent->_data, 6); |
lo | 26:271d2d510f6c | 193 | |
lo | 26:271d2d510f6c | 194 | a[0] = (short) (parent->_data[0]<<8 | parent->_data[1]); // X |
lo | 26:271d2d510f6c | 195 | a[1] = (short) (parent->_data[4]<<8 | parent->_data[5]); // Y |
lo | 26:271d2d510f6c | 196 | a[2] = (short) (parent->_data[2]<<8 | parent->_data[3]); // Z |
lo | 26:271d2d510f6c | 197 | return a; |
lo | 26:271d2d510f6c | 198 | } |
lo | 26:271d2d510f6c | 199 | |
lo | 26:271d2d510f6c | 200 | private: |
lo | 26:271d2d510f6c | 201 | LSM303DLHC_component *parent; |
lo | 26:271d2d510f6c | 202 | }; |
lo | 26:271d2d510f6c | 203 | }; |
lo | 26:271d2d510f6c | 204 | |
lo | 26:271d2d510f6c | 205 | #endif /* COMPONENTS_LSM303D_COMPONENT_HPP_ */ |
lo | 26:271d2d510f6c | 206 |