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