libraries / Adafruit_Sensor-master / Adafruit_Sensor.hon commit Added link to project report (97a3ba0)
   1/*
   2* Copyright (C) 2008 The Android Open Source Project
   3*
   4* Licensed under the Apache License, Version 2.0 (the "License");
   5* you may not use this file except in compliance with the License.
   6* You may obtain a copy of the License at
   7*
   8* http://www.apache.org/licenses/LICENSE-2.0
   9*
  10* Unless required by applicable law or agreed to in writing, software< /span>
  11* distributed under the License is distributed on an "AS IS" BASIS,
  12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13* See the License for the specific language governing permissions and
  14* limitations under the License.
  15*/
  16
  17/* Update by K. Townsend (Adafruit Industries) for lighter typedefs, and
  18 * extended sensor support to include color, voltage and current */
  19 
  20#ifndef _ADAFRUIT_SENSOR_H
  21#define _ADAFRUIT_SENSOR_H
  22
  23#if ARDUINO >= 100
  24 #include "Arduino.h"
  25 #include "Print.h"
  26#else
  27 #include "WProgram.h"
  28#endif
  29
  30/* Intentionally modeled after sensors.h in the Android API:
  31 * https://github.com/android/platform_hardware_libhardware/blob/master/include/hardware/sensors.h */
  32
  33/* Constants */
  34#define SENSORS_GRAVITY_EARTH             (9.80665F)              /**< Earth's gravity in m/s^2 */
  35#define SENSORS_GRAVITY_MOON              (1.6F)                  /**< The moon's gravity in m/s^2 */
  36#define SENSORS_GRAVITY_SUN               (275.0F)                /**< The sun's gravity in m/s^2 */
  37#define SENSORS_GRAVITY_STANDARD          (SENSORS_GRAVITY_EARTH)
  38#define SENSORS_MAGFIELD_EARTH_MAX        (60.0F)                 /**< Maximum magnetic field on Earth's surface */
  39#define SENSORS_MAGFIELD_EARTH_MIN        (30.0F)                 /**< Minimum magnetic field on Earth's surface */
  40#define SENSORS_PRESSURE_SEALEVELHPA      (1013.25F)              /**< Average sea level pressure is 1013.25 hPa */
  41#define SENSORS_DPS_TO_RADS               (0.017453293F)          /**< Degrees/s to rad/s multiplier */
  42#define SENSORS_GAUSS_TO_MICROTESLA       (100)                   /**< Gauss to micro-Tesla multiplier */
  43
  44/** Sensor types */
  45typedef enum
  46{
  47  SENSOR_TYPE_ACCELEROMETER         = (1),   /**< Gravity + linear acceleration */
  48  SENSOR_TYPE_MAGNETIC_FIELD        = (2),
  49  SENSOR_TYPE_ORIENTATION           = (3),
  50  SENSOR_TYPE_GYROSCOPE             = (4),
  51  SENSOR_TYPE_LIGHT                 = (5),
  52  SENSOR_TYPE_PRESSURE              = (6),
  53  SENSOR_TYPE_PROXIMITY             = (8),
  54  SENSOR_TYPE_GRAVITY               = (9),
  55  SENSOR_TYPE_LINEAR_ACCELERATION   = (10),  /**< Acceleration not including gravity */
  56  SENSOR_TYPE_ROTATION_VECTOR       = (11),
  57  SENSOR_TYPE_RELATIVE_HUMIDITY     = (12),
  58  SENSOR_TYPE_AMBIENT_TEMPERATURE   = (13),
  59  SENSOR_TYPE_VOLTAGE               = (15),
  60  SENSOR_TYPE_CURRENT               = (16),
  61  SENSOR_TYPE_COLOR                 = (17)
  62} sensors_type_t;
  63
  64/** struct sensors_vec_s is used to return a vector in a common format. */
  65typedef struct {
  66    union {
  67        float v[3];
  68        struct {
  69            float x;
  70            float y;
  71            float z;
  72        };
  73        /* Orientation sensors */
  74        struct {
  75            float roll;    /**< Rotation around the longitudinal axis (the plane body, 'X axis'). Roll is positive and increasing when moving downward. -90°<=roll<=90° */
  76            float pitch;   /**< Rotation around the lateral axis (the wing span, 'Y axis'). Pitch is positive and increasing when moving upwards. -180°<=pitch<=180°) */
  77            float heading; /**< Angle between the longitudinal axis (the plane body) and magnetic north, measured clockwise when viewing from the top of the device. 0-359° */
  78        };
  79    };
  80    int8_t status;
  81    uint8_t reserved[3];
  82} sensors_vec_t;
  83
  84/** struct sensors_color_s is used to return color data in a common format. */
  85typedef struct {
  86    union {
  87        float c[3];
  88        /* RGB color space */
  89        struct {
  90            float r;       /**< Red component */
  91            float g;       /**< Green component */
  92            float b;       /**< Blue component */
  93        };
  94    };
  95    uint32_t rgba;         /**< 24-bit RGBA value */
  96} sensors_color_t;
  97
  98/* Sensor event (36 bytes) */
  99/** struct sensor_event_s is used to provide a single sensor event in a common format. */
 100typedef struct
 101{
 102    int32_t version;                          /**< must be sizeof(struct sensors_event_t) */
 103    int32_t sensor_id;                        /**< unique sensor identifier */
 104    int32_t type;                             /**< sensor type */
 105    int32_t reserved0;                        /**< reserved */
 106    int32_t timestamp;                        /**< time is in milliseconds */
 107    union
 108    {
 109        float           data[4];
 110        sensors_vec_t   acceleration;         /**< acceleration values are in meter per second per second (m/s^2) */
 111        sensors_vec_t   magnetic;             /**< magnetic vector values are in micro-Tesla (uT) */
 112        sensors_vec_t   orientation;          /**< orientation values are in degrees */
 113        sensors_vec_t   gyro;                 /**< gyroscope values are in rad/s */
 114        float           temperature;          /**< temperature is in degrees centigrade (Celsius) */
 115        float           distance;             /**< distance in centimeters */
 116        float           light;                /**< light in SI lux units */
 117        float           pressure;             /**< pressure in hectopascal (hPa) */
 118        float           relative_humidity;    /**< relative humidity in percent */
 119        float           current;              /**< current in milliamps (mA) */
 120        float           voltage;              /**< voltage in volts (V) */
 121        sensors_color_t color;                /**< color in RGB component values */
 122    };
 123} sensors_event_t;
 124
 125/* Sensor details (40 bytes) */
 126/** struct sensor_s is used to describe basic information about a specific sensor. */
 127typedef struct
 128{
 129    char     name[12];                        /**< sensor name */
 130    int32_t  version;                         /**< version of the hardware + driver */
 131    int32_t  sensor_id;                       /**< unique sensor identifier */
 132    int32_t  type;                            /**< this sensor's type (ex. SENSOR_TYPE_LIGHT) */
 133    float    max_value;                       /**< maximum value of this sensor's value in SI units */
 134    float    min_value;                       /**< minimum value of this sensor's value in SI units */
 135    float    resolution;                      /**< smallest difference between two values reported by this sensor */
 136    int32_t  min_delay;                       /**< min delay in microseconds between events. zero = not a constant rate */
 137} sensor_t;
 138
 139class Adafruit_Sensor {
 140 public:
 141  // Constructor(s)
 142  Adafruit_Sensor() {}
 143  virtual ~Adafruit_Sensor() {}
 144
 145  // These must be defined by the subclass
 146  virtual void enableAutoRange(bool enabled) {};
 147  virtual bool getEvent(sensors_event_t*) = 0;
 148  virtual void getSensor(sensor_t*) = 0;
 149  
 150 private:
 151  bool _autoRange;
 152};
 153
 154#endif