Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

Committer:
lo
Date:
Wed Oct 03 17:22:58 2018 +0000
Revision:
31:2b8b98f3feed
Parent:
26:271d2d510f6c
Child:
32:3bef9b81f639
completed component methods

Who changed what in which revision?

UserRevisionLine numberNew 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 31:2b8b98f3feed 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 31:2b8b98f3feed 133 )
lo 31:2b8b98f3feed 134 {
lo 31:2b8b98f3feed 135 this->parent = parent;
lo 31:2b8b98f3feed 136 this->setDeviceType(type);
lo 31:2b8b98f3feed 137 this->setMisnetCode(misnet_code);
lo 31:2b8b98f3feed 138 this->setState(state);
lo 31:2b8b98f3feed 139 this->setAccessType(access_type);
lo 31:2b8b98f3feed 140 this->setRequestMode(request_mode);
lo 31:2b8b98f3feed 141 this->setUpMode(up_mode);
lo 31:2b8b98f3feed 142 this->setAction(action);
lo 31:2b8b98f3feed 143 this->setOutputMode(output_mode);
lo 31:2b8b98f3feed 144 this->setComment(comment);
lo 31:2b8b98f3feed 145 this->setSubsampleRate(subsample_rate);
lo 31:2b8b98f3feed 146 }
lo 31:2b8b98f3feed 147 virtual ~LSM303DLHC_accelerometer() {}
lo 31:2b8b98f3feed 148 int* readValue(void) {
lo 31:2b8b98f3feed 149 int a[3];
lo 31:2b8b98f3feed 150 parent->_data[0] = OUT_X_L_A | (1<<7);
lo 31:2b8b98f3feed 151 parent->_device.write(ACC_ADDRESS, _data, 1);
lo 31:2b8b98f3feed 152 parent->_device.read(ACC_ADDRESS, _data, 6);
lo 31:2b8b98f3feed 153
lo 31:2b8b98f3feed 154 // 12-bit values
lo 31:2b8b98f3feed 155 a[0] = (short)(parent->_data[1]<<8 | parent->_data[0]) >> 4;
lo 31:2b8b98f3feed 156 a[1] = (short)(parent->_data[3]<<8 | parent->_data[2]) >> 4;
lo 31:2b8b98f3feed 157 a[2] = (short)(parent->_data[5]<<8 | parent->_data[4]) >> 4;
lo 31:2b8b98f3feed 158 return a;
lo 31:2b8b98f3feed 159 }
lo 31:2b8b98f3feed 160
lo 31:2b8b98f3feed 161 private:
lo 31:2b8b98f3feed 162 LSM303DLHC_component *parent;
lo 31:2b8b98f3feed 163 };
lo 31:2b8b98f3feed 164
lo 31:2b8b98f3feed 165 class LSM303DLHC_megnetometer : public Service{
lo 31:2b8b98f3feed 166
lo 31:2b8b98f3feed 167 public:
lo 31:2b8b98f3feed 168 LSM303DLHC_megnetometer(
lo 31:2b8b98f3feed 169 DEVICE_TYPE type,
lo 31:2b8b98f3feed 170 MISNET_CODE misnet_code,
lo 31:2b8b98f3feed 171 STATE state,
lo 31:2b8b98f3feed 172 ACCESS_TYPE access_type,
lo 31:2b8b98f3feed 173 REQUEST_MODE request_mode,
lo 31:2b8b98f3feed 174 UP_MODE up_mode,
lo 31:2b8b98f3feed 175 ACCESS_PIN access_pins[6],
lo 31:2b8b98f3feed 176 uint32_t subsample_rate,
lo 31:2b8b98f3feed 177 ACTION action,
lo 31:2b8b98f3feed 178 OUTPUT_MODE output_mode,
lo 31:2b8b98f3feed 179 string comment,
lo 31:2b8b98f3feed 180 LSM303DLHC_component* parent
lo 31:2b8b98f3feed 181 )
lo 31:2b8b98f3feed 182 {
lo 31:2b8b98f3feed 183 this->parent = parent;
lo 31:2b8b98f3feed 184 this->setDeviceType(type);
lo 31:2b8b98f3feed 185 this->setMisnetCode(misnet_code);
lo 31:2b8b98f3feed 186 this->setState(state);
lo 31:2b8b98f3feed 187 this->setAccessType(access_type);
lo 31:2b8b98f3feed 188 this->setRequestMode(request_mode);
lo 31:2b8b98f3feed 189 this->setUpMode(up_mode);
lo 31:2b8b98f3feed 190 this->setAction(action);
lo 31:2b8b98f3feed 191 this->setOutputMode(output_mode);
lo 31:2b8b98f3feed 192 this->setComment(comment);
lo 31:2b8b98f3feed 193 this->setSubsampleRate(subsample_rate);
lo 31:2b8b98f3feed 194 }
lo 31:2b8b98f3feed 195 virtual ~LSM303DLHC_megnetometer() {}
lo 31:2b8b98f3feed 196 int* readValue(void) {
lo 31:2b8b98f3feed 197 int a[3];
lo 31:2b8b98f3feed 198 parent->_data[0] = OUT_X_H_M;
lo 31:2b8b98f3feed 199 parent->_device.write(MAG_ADDRESS, parent->_data, 1);
lo 31:2b8b98f3feed 200 parent->_device.read(MAG_ADDRESS, parent->_data, 6);
lo 31:2b8b98f3feed 201
lo 31:2b8b98f3feed 202 a[0] = (short) (parent->_data[0]<<8 | parent->_data[1]); // X
lo 31:2b8b98f3feed 203 a[1] = (short) (parent->_data[4]<<8 | parent->_data[5]); // Y
lo 31:2b8b98f3feed 204 a[2] = (short) (parent->_data[2]<<8 | parent->_data[3]); // Z
lo 31:2b8b98f3feed 205 return a;
lo 31:2b8b98f3feed 206 }
lo 31:2b8b98f3feed 207
lo 31:2b8b98f3feed 208 private:
lo 31:2b8b98f3feed 209 LSM303DLHC_component *parent;
lo 31:2b8b98f3feed 210 };
lo 31:2b8b98f3feed 211 };
lo 31:2b8b98f3feed 212
lo 31:2b8b98f3feed 213 #endif /* COMPONENTS_LSM303D_COMPONENT_HPP_ */
lo 31:2b8b98f3feed 214