gy65: Added new digital pressure sensor
[contrib/upm.git] / src / gy65 / gy65.h
1 /*
2  * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
3  * Copyright (c) 2014 Intel Corporation.
4  *
5  * Credits to Adafruit.
6  * Based on Adafruit BMP085 library.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining
9  * a copy of this software and associated documentation files (the
10  * "Software"), to deal in the Software without restriction, including
11  * without limitation the rights to use, copy, modify, merge, publish,
12  * distribute, sublicense, and/or sell copies of the Software, and to
13  * permit persons to whom the Software is furnished to do so, subject to
14  * the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be
17  * included in all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  */
27 #pragma once
28
29 #include <string>
30 #include <maa/i2c.h>
31 #include <math.h>
32
33 #define ADDR               0x77 // device address
34
35 // registers address
36 #define BMP085_ULTRALOWPOWER 0
37 #define BMP085_STANDARD      1
38 #define BMP085_HIGHRES       2
39 #define BMP085_ULTRAHIGHRES  3
40 #define BMP085_CAL_AC1           0xAA  // R   Calibration data (16 bits)
41 #define BMP085_CAL_AC2           0xAC  // R   Calibration data (16 bits)
42 #define BMP085_CAL_AC3           0xAE  // R   Calibration data (16 bits)
43 #define BMP085_CAL_AC4           0xB0  // R   Calibration data (16 bits)
44 #define BMP085_CAL_AC5           0xB2  // R   Calibration data (16 bits)
45 #define BMP085_CAL_AC6           0xB4  // R   Calibration data (16 bits)
46 #define BMP085_CAL_B1            0xB6  // R   Calibration data (16 bits)
47 #define BMP085_CAL_B2            0xB8  // R   Calibration data (16 bits)
48 #define BMP085_CAL_MB            0xBA  // R   Calibration data (16 bits)
49 #define BMP085_CAL_MC            0xBC  // R   Calibration data (16 bits)
50 #define BMP085_CAL_MD            0xBE  // R   Calibration data (16 bits)
51
52 #define BMP085_CONTROL           0xF4
53 #define BMP085_TEMPDATA          0xF6
54 #define BMP085_PRESSUREDATA      0xF6
55 #define BMP085_READTEMPCMD       0x2E
56 #define BMP085_READPRESSURECMD   0x34
57
58 #define HIGH               1
59 #define LOW                0
60
61 namespace upm {
62
63 /**
64  * @brief C++ API for GY65 chip (Atmospheric Pressure Sensor)
65  *
66  * This file defines the gy65 C++ interface for libgy65
67  *
68  * @snippet gy65.cxx Interesting
69  */
70 class GY65 {
71     public:
72         /**
73          * Instanciates a GY65 object
74          *
75          * @param bus number of used bus
76          * @param devAddr addres of used i2c device
77          */
78         GY65 (int bus, int devAddr, uint8_t mode = BMP085_ULTRAHIGHRES);
79
80         /**
81          * GY65 object destructor, basicaly it close i2c connection.
82          */
83         ~GY65 ();
84
85         /**
86          * Return calculated pressure
87          */
88         int32_t getPressure ();
89
90         /**
91          *
92          * Get raw pressure data
93          */
94         int32_t getPressureRaw ();
95
96         /**
97          * Get raw temperature data from chip
98          */
99         int16_t getTemperatureRaw ();
100
101         /**
102          * Return calculated temperature
103          */
104         float getTemperature ();
105
106         /**
107          * With given absolute altitude sea level can be calculated
108          *
109          * @param altitudeMeters altitude
110          */
111         int32_t getSealevelPressure(float altitudeMeters = 0);
112
113         /**
114          * With given sea level altitude in meters can be calculated
115          *
116          * @param sealevelPressure Sea level
117          */
118         float getAltitude (float sealevelPressure = 101325);
119
120         /**
121          * Calculation of B5 (check spec for more information)
122          *
123          * @param UT
124          */
125         int32_t computeB5 (int32_t UT);
126
127         /**
128          * Read two bytes register
129          *
130          * @param reg address of a register
131          */
132         uint16_t i2cReadReg_16 (int reg);
133
134         /**
135          * Write to one byte register
136          *
137          * @param reg address of a register
138          * @param value byte to be written
139          */
140         maa_result_t i2cWriteReg (uint8_t reg, uint8_t value);
141
142         /**
143          * Read one byte register
144          *
145          * @param reg address of a register
146          */
147         uint8_t i2cReadReg_8 (int reg);
148
149     private:
150         std::string m_name;
151
152         int m_controlAddr;
153         int m_bus;
154         maa_i2c_context m_i2ControlCtx;
155
156         uint8_t oversampling;
157         int16_t ac1, ac2, ac3, b1, b2, mb, mc, md;
158         uint16_t ac4, ac5, ac6;
159 };
160
161 }