Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

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?

UserRevisionLine numberNew 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