lora sensnode

Dependencies:   libmDot mbed-rtos mbed

Fork of mDot_LoRa_Sensornode by Adrian Mitevski

Revision:
0:f2815503561f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/MPU9250.h	Wed Jul 06 20:40:36 2016 +0000
@@ -0,0 +1,444 @@
+/**
+ * @file MPU9250.h
+ *
+ * @author Adrian
+ * @date 19.05.2016
+ *
+ */
+#include "I2C_RT.h"
+#include "MPU9250Config.h"
+
+#ifndef APP_MPU9250_H_
+#define APP_MPU9250_H_
+
+#define MPU9250_DEFAULT_ADDRESS         0xD1
+#define MPU9250_ALT_DEFAULT_ADDRESS     0xD2
+
+#define MPU9250_SELF_TEST_X_GYRO        0x00
+#define MPU9250_SELF_TEST_Y_GYRO        0x01
+#define MPU9250_SELF_TEST_Z_GYRO        0x02
+
+#define MPU9250_SELF_TEST_X_ACCEL       0x0D
+#define MPU9250_SELF_TEST_Y_ACCEL       0x0E
+#define MPU9250_SELF_TEST_Z_ACCEL       0x0F
+
+#define MPU9250_XG_OFFSET_H             0x13
+#define MPU9250_XG_OFFSET_L             0x14
+#define MPU9250_YG_OFFSET_H             0x15
+#define MPU9250_YG_OFFSET_L             0x16
+#define MPU9250_ZG_OFFSET_H             0x17
+#define MPU9250_ZG_OFFSET_L             0x18
+#define MPU9250_SMPLRT_DIV              0x19
+#define MPU9250_CONFIG                  0x1A
+#define MPU9250_GYRO_CONFIG             0x1B
+#define MPU9250_ACCEL_CONFIG            0x1C
+#define MPU9250_ACCEL_CONFIG2           0x1D
+#define MPU9250_LP_ACCEL_ODR            0x1E
+#define MPU9250_WOM_THR                 0x1F
+
+#define MPU9250_FIFO_EN                 0x23
+#define MPU9250_I2C_MST_CTRL            0x24
+#define MPU9250_I2C_SLV0_ADDR           0x25
+#define MPU9250_I2C_SLV0_REG            0x26
+#define MPU9250_I2C_SLV0_CTRL           0x27
+#define MPU9250_I2C_SLV1_ADDR           0x28
+#define MPU9250_I2C_SLV1_REG            0x29
+#define MPU9250_I2C_SLV1_CTRL           0x2A
+#define MPU9250_I2C_SLV2_ADDR           0x2B
+#define MPU9250_I2C_SLV2_REG            0x2C
+#define MPU9250_I2C_SLV2_CTRL           0x2D
+#define MPU9250_I2C_SLV3_ADDR           0x2E
+#define MPU9250_I2C_SLV3_REG            0x2F
+#define MPU9250_I2C_SLV3_CTRL           0x30
+#define MPU9250_I2C_SLV4_ADDR           0x31
+#define MPU9250_I2C_SLV4_REG            0x32
+#define MPU9250_I2C_SLV4_DO             0x33
+#define MPU9250_I2C_SLV4_CTRL           0x34
+#define MPU9250_I2C_SLV4_DI             0x35
+#define MPU9250_I2C_MST_STATUS          0x36
+#define MPU9250_INT_PIN_CFG             0x37
+#define MPU9250_INT_ENABLE              0x38
+
+#define MPU9250_INT_STATUS              0x3A
+#define MPU9250_ACCEL_XOUT_H            0x3B
+#define MPU9250_ACCEL_XOUT_L            0x3C
+#define MPU9250_ACCEL_YOUT_H            0x3D
+#define MPU9250_ACCEL_YOUT_L            0x3E
+#define MPU9250_ACCEL_ZOUT_H            0x3F
+#define MPU9250_ACCEL_ZOUT_L            0x40
+#define MPU9250_TEMP_OUT_H              0x41
+#define MPU9250_TEMP_OUT_L              0x42
+#define MPU9250_GYRO_XOUT_H             0x43
+#define MPU9250_GYRO_XOUT_L             0x44
+#define MPU9250_GYRO_YOUT_H             0x45
+#define MPU9250_GYRO_YOUT_L             0x46
+#define MPU9250_GYRO_ZOUT_H             0x47
+#define MPU9250_GYRO_ZOUT_L             0x48
+#define MPU9250_EXT_SENS_DATA_00        0x49
+#define MPU9250_EXT_SENS_DATA_01        0x4A
+#define MPU9250_EXT_SENS_DATA_02        0x4B
+#define MPU9250_EXT_SENS_DATA_03        0x4C
+#define MPU9250_EXT_SENS_DATA_04        0x4D
+#define MPU9250_EXT_SENS_DATA_05        0x4E
+#define MPU9250_EXT_SENS_DATA_06        0x4F
+#define MPU9250_EXT_SENS_DATA_07        0x50
+#define MPU9250_EXT_SENS_DATA_08        0x51
+#define MPU9250_EXT_SENS_DATA_09        0x52
+#define MPU9250_EXT_SENS_DATA_10        0x53
+#define MPU9250_EXT_SENS_DATA_11        0x54
+#define MPU9250_EXT_SENS_DATA_12        0x55
+#define MPU9250_EXT_SENS_DATA_13        0x56
+#define MPU9250_EXT_SENS_DATA_14        0x57
+#define MPU9250_EXT_SENS_DATA_15        0x58
+#define MPU9250_EXT_SENS_DATA_16        0x59
+#define MPU9250_EXT_SENS_DATA_17        0x5A
+#define MPU9250_EXT_SENS_DATA_18        0x5B
+#define MPU9250_EXT_SENS_DATA_19        0x5C
+#define MPU9250_EXT_SENS_DATA_20        0x5D
+#define MPU9250_EXT_SENS_DATA_21        0x5E
+#define MPU9250_EXT_SENS_DATA_22        0x5F
+#define MPU9250_EXT_SENS_DATA_23        0x60
+
+#define MPU9250_I2C_SLV0_DO             0x63
+#define MPU9250_I2C_SLV1_DO             0x64
+#define MPU9250_I2C_SLV2_DO             0x65
+#define MPU9250_I2C_SLV3_DO             0x66
+#define MPU9250_I2C_MST_DELAY_CTRL      0x67
+#define MPU9250_SIGNAL_PATH_RESET       0x68
+#define MPU9250_MOT_DETECT_CTRL         0x69
+#define MPU9250_USER_CTRL               0x6A
+#define MPU9250_PWR_MGMT_1              0x6B
+#define MPU9250_PWR_MGMT_2              0x6C
+
+#define MPU9250_FIFO_COUNTH             0x72
+#define MPU9250_FIFO_COUNTL             0x73
+#define MPU9250_FIFO_R_W                0x74
+#define MPU9250_WHO_AM_I                0x75
+#define MPU9250_XA_OFFSET_H             0x77
+#define MPU9250_XA_OFFSET_L             0x78
+
+#define MPU9250_YA_OFFSET_H             0x7A
+#define MPU9250_YA_OFFSET_L             0x7B
+
+#define MPU9250_ZA_OFFSET_H             0x7D
+#define MPU9250_ZA_OFFSET_L             0x7E
+
+//reset values
+#define WHOAMI_RESET_VAL                0x71
+#define POWER_MANAGMENT_1_RESET_VAL     0x01
+#define DEFAULT_RESET_VALUE             0x00
+
+#define WHOAMI_DEFAULT_VAL              0x68
+
+//CONFIG register masks
+#define MPU9250_FIFO_MODE_MASK          0x40
+#define MPU9250_EXT_SYNC_SET_MASK       0x38
+#define MPU9250_DLPF_CFG_MASK           0x07
+
+//GYRO_CONFIG register masks
+#define MPU9250_XGYRO_CTEN_MASK         0x80
+#define MPU9250_YGYRO_CTEN_MASK         0x40
+#define MPU9250_ZGYRO_CTEN_MASK         0x20
+#define MPU9250_GYRO_FS_SEL_MASK        0x18
+#define MPU9250_FCHOICE_B_MASK          0x03
+
+//ACCEL_CONFIG register masks
+#define MPU9250_AX_ST_EN_MASK           0x80
+#define MPU9250_AY_ST_EN_MASK           0x40
+#define MPU9250_AZ_ST_EN_MASK           0x20
+#define MPU9250_ACCEL_FS_SEL_MASK       0x18
+
+//ACCEL_CONFIG_2 register masks
+#define MPU9250_ACCEL_FCHOICE_B_MASK    0xC0
+#define MPU9250_A_DLPF_CFG_MASK         0x03
+
+//LP_ACCEL_ODR register masks
+#define MPU9250_LPOSC_CLKSEL_MASK       0x0F
+
+//FIFO_EN register masks
+#define MPU9250_TEMP_FIFO_EN_MASK       0x80
+#define MPU9250_GYRO_XOUT_MASK          0x40
+#define MPU9250_GYRO_YOUT_MASK          0x20
+#define MPU9250_GYRO_ZOUT_MASK          0x10
+#define MPU9250_ACCEL_MASK              0x08
+#define MPU9250_SLV2_MASK               0x04
+#define MPU9250_SLV1_MASK               0x02
+#define MPU9250_SLV0_MASK               0x01
+
+//I2C_MST_CTRL register masks
+#define MPU9250_MULT_MST_EN_MASK        0x80
+#define MPU9250_WAIT_FOR_ES_MASK        0x40
+#define MPU9250_SLV_3_FIFO_EN_MASK      0x20
+#define MPU9250_I2C_MST_P_NSR_MASK      0x10
+#define MPU9250_I2C_MST_CLK_MASK        0x0F
+
+//I2C_SLV0_ADDR register masks
+#define MPU9250_I2C_SLV0_RNW_MASK       0x80
+#define MPU9250_I2C_ID_0_MASK           0x7F
+
+//I2C_SLV0_CTRL register masks
+#define MPU9250_I2C_SLV0_EN_MASK        0x80
+#define MPU9250_I2C_SLV0_BYTE_SW_MASK   0x40
+#define MPU9250_I2C_SLV0_REG_DIS_MASK   0x20
+#define MPU9250_I2C_SLV0_GRP_MASK       0x10
+#define MPU9250_I2C_SLV0_LENG_MASK      0x0F
+
+//I2C_SLV1_ADDR register masks
+#define MPU9250_I2C_SLV1_RNW_MASK       0x80
+#define MPU9250_I2C_ID_1_MASK           0x7F
+
+//I2C_SLV1_CTRL register masks
+#define MPU9250_I2C_SLV1_EN_MASK        0x80
+#define MPU9250_I2C_SLV1_BYTE_SW_MASK   0x40
+#define MPU9250_I2C_SLV1_REG_DIS_MASK   0x20
+#define MPU9250_I2C_SLV1_GRP_MASK       0x10
+#define MPU9250_I2C_SLV1_LENG_MASK      0x0F
+
+//I2C_SLV2_ADDR register masks
+#define MPU9250_I2C_SLV2_RNW_MASK       0x80
+#define MPU9250_I2C_ID_2_MASK           0x7F
+
+//I2C_SLV2_CTRL register masks
+#define MPU9250_I2C_SLV2_EN_MASK        0x80
+#define MPU9250_I2C_SLV2_BYTE_SW_MASK   0x40
+#define MPU9250_I2C_SLV2_REG_DIS_MASK   0x20
+#define MPU9250_I2C_SLV2_GRP_MASK       0x10
+#define MPU9250_I2C_SLV2_LENG_MASK      0x0F
+
+//I2C_SLV3_ADDR register masks
+#define MPU9250_I2C_SLV3_RNW_MASK       0x80
+#define MPU9250_I2C_ID_3_MASK           0x7F
+
+//I2C_SLV3_CTRL register masks
+#define MPU9250_I2C_SLV3_EN_MASK        0x80
+#define MPU9250_I2C_SLV3_BYTE_SW_MASK   0x40
+#define MPU9250_I2C_SLV3_REG_DIS_MASK   0x20
+#define MPU9250_I2C_SLV3_GRP_MASK       0x10
+#define MPU9250_I2C_SLV3_LENG_MASK      0x0F
+
+//I2C_SLV4_ADDR register masks
+#define MPU9250_I2C_SLV4_RNW_MASK       0x80
+#define MPU9250_I2C_ID_4_MASK           0x7F
+
+//I2C_SLV4_CTRL register masks
+#define MPU9250_I2C_SLV4_EN_MASK        0x80
+#define MPU9250_SLV4_DONE_INT_EN_MASK   0x40
+#define MPU9250_I2C_SLV4_REG_DIS_MASK   0x20
+#define MPU9250_I2C_MST_DLY_MASK        0x1F
+
+//I2C_MST_STATUS register masks
+#define MPU9250_PASS_THROUGH_MASK       0x80
+#define MPU9250_I2C_SLV4_DONE_MASK      0x40
+#define MPU9250_I2C_LOST_ARB_MASK       0x20
+#define MPU9250_I2C_SLV4_NACK_MASK      0x10
+#define MPU9250_I2C_SLV3_NACK_MASK      0x08
+#define MPU9250_I2C_SLV2_NACK_MASK      0x04
+#define MPU9250_I2C_SLV1_NACK_MASK      0x02
+#define MPU9250_I2C_SLV0_NACK_MASK      0x01
+
+//INT_STATUS register masks
+#define MPU9250_WOM_INT_MASK            0x40
+#define MPU9250_FIFO_OFLOW_INT_MASK     0x10
+#define MPU9250_FSYNC_INT_MASK          0x08
+#define MPU9250_RAW_DATA_RDY_INT_MASK   0x01
+
+//I2C_MST_DELAY_CTRL register masks
+#define MPU9250_DELAY_ES_SHADOW_MASK    0x80
+#define MPU9250_I2C_SLV4_DLY_EN_MASK    0x10
+#define MPU9250_I2C_SLV3_DLY_EN_MASK    0x08
+#define MPU9250_I2C_SLV2_DLY_EN_MASK    0x04
+#define MPU9250_I2C_SLV1_DLY_EN_MASK    0x02
+#define MPU9250_I2C_SLV0_DLY_EN_MASK    0x01
+
+//SIGNAL_PATH_RESET register masks
+#define MPU9250_GYRO_RST_MASK           0x04
+#define MPU9250_ACCEL_RST_MASK          0x02
+#define MPU9250_TEMP_RST_MASK           0x01
+
+//MOT_DETECT_CTRL register masks
+#define MPU9250_ACCEL_INTEL_EN_MASK     0x80
+#define MPU9250_ACCEL_INTEL_MODE_MASK   0x40
+
+//USER_CTRL register masks
+#define MPU9250_FIFO_EN_MASK            0x40
+#define MPU9250_I2C_MST_EN_MASK         0x20
+#define MPU9250_I2C_IF_DIS_MASK         0x10
+#define MPU9250_FIFO_RST_MASK           0x04
+#define MPU9250_I2C_MST_RST_MASK        0x02
+#define MPU9250_SIG_COND_RST_MASK       0x01
+
+//PWR_MGMT_1 register masks
+#define MPU9250_H_RESET_MASK            0x80
+#define MPU9250_SLEEP_MASK              0x40
+#define MPU9250_CYCLE_MASK              0x20
+#define MPU9250_GYRO_STANDBY_CYCLE_MASK 0x10
+#define MPU9250_PD_PTAT_MASK            0x08
+#define MPU9250_CLKSEL_MASK             0x07
+
+//PWR_MGMT_2 register masks
+#define MPU9250_DISABLE_XA_MASK         0x20
+#define MPU9250_DISABLE_YA_MASK         0x10
+#define MPU9250_DISABLE_ZA_MASK         0x08
+#define MPU9250_DISABLE_XG_MASK         0x04
+#define MPU9250_DISABLE_YG_MASK         0x02
+#define MPU9250_DISABLE_ZG_MASK         0x01
+
+#define MPU9250_DISABLE_XYZA_MASK       0x38
+#define MPU9250_DISABLE_XYZG_MASK       0x07
+
+//Magnetometer register maps
+#define MPU9250_MAG_ADDRESS             0x0C<<1//Shift by 1 needed for access via I2C
+
+#define MPU9250_MAG_WIA                 0x00
+#define MPU9250_MAG_INFO                0x01
+#define MPU9250_MAG_ST1                 0x02
+#define MPU9250_MAG_XOUT_L              0x03
+#define MPU9250_MAG_XOUT_H              0x04
+#define MPU9250_MAG_YOUT_L              0x05
+#define MPU9250_MAG_YOUT_H              0x06
+#define MPU9250_MAG_ZOUT_L              0x07
+#define MPU9250_MAG_ZOUT_H              0x08
+#define MPU9250_MAG_ST2                 0x09
+#define MPU9250_MAG_CNTL1               0x0A
+#define MPU9250_MAG_CNTL2               0x0B //reserved mystery meat
+#define MPU9250_MAG_ASTC                0x0C
+#define MPU9250_MAG_TS1                 0x0D
+#define MPU9250_MAG_TS2                 0x0E
+#define MPU9250_MAG_I2CDIS              0x0F
+#define MPU9250_MAG_ASAX                0x10
+#define MPU9250_MAG_ASAY                0x11
+#define MPU9250_MAG_ASAZ                0x12
+
+//Magnetometer register masks
+#define MPU9250_WIA_MASK 0x48
+
+/**
+ * @class MPU9250
+ * @brief Provides Functionality to control the MPU9250 Sensor on the Sensbert
+ */
+class MPU9250 {
+public:
+	MPU9250(I2C_RT* i2c);
+	virtual ~MPU9250();
+
+	/**
+	 * @brief Initializes the MPU9250 according to the desired MPU9250_MODE
+	 * @param desiredMode the desired Mode depending on which the MPU9250 has to be
+	 * configured
+	 */
+	void init(MPU9250_MODE desiredMode);
+
+
+	/**
+	 * @brief Gets the measured x-axis acceleration.
+	 * Important: Acceleration measurement first needs to be enable by
+	 * enableAccelerationMeasurement()
+	 * @return
+	 */
+	float getXAxisAcceleration();
+
+	/**
+	 * @brief Gets the measured y-axis acceleration.
+	 * Important: Acceleration measurement first needs to be enable by
+	 * enableAccelerationMeasurement()
+	 * @return
+	 */
+	float getYAxisAcceleration();
+
+	/**
+	 * @brief Gets the measured z-axis acceleration.
+	 * Important: Acceleration measurement first needs to be enable by
+	 * enableAccelerationMeasurement()
+	 * @return
+	 */
+	float getZAxisAcceleration();
+
+	/**
+	 * @brief Gets the measured x-axis gyroscope value.
+	 * Important: Acceleration measurement first needs to be enable by
+	 * enableAccelerationMeasurement()
+	 * @return
+	 */
+	float getXAxisGyro();
+
+	/**
+	 * @brief Gets the measured y-axis gyroscope value
+	 * Important: Gyroscope measurement first needs to be enable by
+	 * enableGyroscopeMeasurement()
+	 * @return
+	 */
+	float getYAxisGyro();
+
+	/**
+	 * @brief Gets the measured z-axis gyroscope value.
+	 * Important: Gyroscope measurement first needs to be enable by
+	 * enableGyroscopeMeasurement()
+	 * @return
+	 */
+	float getZAxisGyro();
+
+	/**
+	 * @brief Gets the measured x-axis tesla value.
+	 * Important: Gyroscope measurement first needs to be enable by
+	 * enableGyroscopeMeasurement()
+	 * @return
+	 */
+	float getXAxisTesla();
+
+	/**
+	 * @brief Gets the measured y-axis tesla value.
+	 * Important: Tesla measurement first needs to be enable by
+	 * enableTeslaMeasurement()
+	 * @return
+	 */
+	float getYAxisTesla();
+
+	/**
+	 * @brief Gets the measured z-axis tesla value.
+	 * Important: Tesla measurement first needs to be enable by
+	 * enableTeslaMeasurement()
+	 * @return
+	 */
+	float getZAxisTesla();
+private:
+	I2C_RT* i2c;
+	MPU9250Config* config;
+
+	/**
+	 * @brief Set the i2c that is used to control the MPU9250
+	 * @param i2c the i2c that is used to control the MPU9250
+	 */
+	void setI2c(I2C_RT* i2c);
+
+	/**
+	 * @brief enables the acceleration measurement for all axis
+	 * according to the MPU9250Config.
+	 */
+	void enableAxisAccelerationMeasurement();
+
+	/**
+	 * @brief enables the gyroscope measurement for all axis
+	 * according to the MPU9250Config.
+	 */
+	void enableAxisGyroscopeMeasurement();
+
+	/**
+	 * @brief enables the tesla measurement for all axis
+	 * according to the MPU9250Config.
+	 */
+	void enableAxisTeslaMeasurement();
+
+
+	/**
+	 * @brief Configures and enables interrupts according to the MPU9250Config
+	 */
+	void configureInterrupts();
+
+	/**
+	 * @brief Sets the motion threshold in g when an interupt is triggered
+	 * according to the MPU9250Config
+	 */
+	void setWakeOnReceiveThreshold();
+};
+
+#endif /* APP_MPU9250_H_ */