arduino/libraries/Adafruit_Circuit_Playground/utility/Adafruit_CPlay_Sensor.h
2018-11-03 20:21:33 +00:00

179 lines
8.2 KiB
C++
Raw Blame History

/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software< /span>
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* Update by K. Townsend (Adafruit Industries) for lighter typedefs, and
* extended sensor support to include color, voltage and current */
#ifndef _ADAFRUIT_SENSOR_H
#define _ADAFRUIT_SENSOR_H
#if ARDUINO >= 100
#include "Arduino.h"
#include "Print.h"
#else
#include "WProgram.h"
#endif
/* Intentionally modeled after sensors.h in the Android API:
* https://github.com/android/platform_hardware_libhardware/blob/master/include/hardware/sensors.h */
/* Constants */
#define SENSORS_GRAVITY_EARTH (9.80665F) ///< Earth's gravity in m/s^2 */
#define SENSORS_GRAVITY_MOON (1.6F) ///< The moon's gravity in m/s^2 */
#define SENSORS_GRAVITY_SUN (275.0F) ///< The sun's gravity in m/s^2 */
#define SENSORS_GRAVITY_STANDARD (SENSORS_GRAVITY_EARTH)
#define SENSORS_MAGFIELD_EARTH_MAX (60.0F) ///< Maximum magnetic field on Earth's surface */
#define SENSORS_MAGFIELD_EARTH_MIN (30.0F) ///< Minimum magnetic field on Earth's surface */
#define SENSORS_PRESSURE_SEALEVELHPA (1013.25F) ///< Average sea level pressure is 1013.25 hPa */
#define SENSORS_DPS_TO_RADS (0.017453293F) ///< Degrees/s to rad/s multiplier */
#define SENSORS_GAUSS_TO_MICROTESLA (100) ///< Gauss to micro-Tesla multiplier */
/** Sensor types */
typedef enum
{
SENSOR_TYPE_ACCELEROMETER = (1), ///< Gravity + linear acceleration */
SENSOR_TYPE_MAGNETIC_FIELD = (2),
SENSOR_TYPE_ORIENTATION = (3),
SENSOR_TYPE_GYROSCOPE = (4),
SENSOR_TYPE_LIGHT = (5),
SENSOR_TYPE_PRESSURE = (6),
SENSOR_TYPE_PROXIMITY = (8),
SENSOR_TYPE_GRAVITY = (9),
SENSOR_TYPE_LINEAR_ACCELERATION = (10), ///< Acceleration not including gravity */
SENSOR_TYPE_ROTATION_VECTOR = (11),
SENSOR_TYPE_RELATIVE_HUMIDITY = (12),
SENSOR_TYPE_AMBIENT_TEMPERATURE = (13),
SENSOR_TYPE_OBJECT_TEMPERATURE = (14),
SENSOR_TYPE_VOLTAGE = (15),
SENSOR_TYPE_CURRENT = (16),
SENSOR_TYPE_COLOR = (17)
} sensors_type_t;
/** struct sensors_vec_s is used to return a vector in a common format. */
typedef struct {
union {
float v[3]; ///< array to store xyz G data
struct {
float x; ///< x-axis G data
float y; ///< y-axis G data
float z; ///< z-axis G data
}; ///< axis data
struct {
float roll; ///< Rotation around the longitudinal axis (the plane body, 'X axis'). Roll is positive and increasing when moving downward. -90<39><=roll<=90<39> */
float pitch; ///< Rotation around the lateral axis (the wing span, 'Y axis'). Pitch is positive and increasing when moving upwards. -180<38><=pitch<=180<38>) */
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<35> */
}; ///< Orientation sensors */
}; ///< union of orientation data
int8_t status; ///< sensor status
uint8_t reserved[3]; ///< reserved
} sensors_vec_t;
/** struct sensors_color_s is used to return color data in a common format. */
typedef struct {
union {
float c[3]; ///< array to hold floating point RGB color
struct {
float r; ///< Red component */
float g; ///< Green component */
float b; ///< Blue component */
}; ///< RGB color space
}; ///< union of RGB color space data
uint32_t rgba; ///< 24-bit RGBA value */
} sensors_color_t;
/* Sensor event (36 bytes) */
/** struct sensor_event_s is used to provide a single sensor event in a common format. */
typedef struct
{
int32_t version; ///< must be sizeof(struct sensors_event_t) */
int32_t sensor_id; ///< unique sensor identifier */
int32_t type; ///< sensor type */
int32_t reserved0; ///< reserved */
int32_t timestamp; ///< time is in milliseconds */
union
{
float data[4]; ///< array for floating point general data
sensors_vec_t acceleration; ///< acceleration values are in meter per second per second (m/s^2) */
sensors_vec_t magnetic; ///< magnetic vector values are in micro-Tesla (uT) */
sensors_vec_t orientation; ///< orientation values are in degrees */
sensors_vec_t gyro; ///< gyroscope values are in rad/s */
float temperature; ///< temperature is in degrees centigrade (Celsius) */
float distance; ///< distance in centimeters */
float light; ///< light in SI lux units */
float pressure; ///< pressure in hectopascal (hPa) */
float relative_humidity; ///< relative humidity in percent */
float current; ///< current in milliamps (mA) */
float voltage; ///< voltage in volts (V) */
sensors_color_t color; ///< color in RGB component values */
}; ///< union of sensor event data
} sensors_event_t;
/* Sensor details (40 bytes) */
/** struct sensor_s is used to describe basic information about a specific sensor. */
typedef struct
{
char name[12]; ///< sensor name */
int32_t version; ///< version of the hardware + driver */
int32_t sensor_id; ///< unique sensor identifier */
int32_t type; ///< this sensor's type (ex. SENSOR_TYPE_LIGHT) */
float max_value; ///< maximum value of this sensor's value in SI units */
float min_value; ///< minimum value of this sensor's value in SI units */
float resolution; ///< smallest difference between two values reported by this sensor */
int32_t min_delay; ///< min delay in microseconds between events. zero = not a constant rate */
} sensor_t;
/**************************************************************************/
/*!
@brief Sensor API class for CircuitPlayground board
*/
/**************************************************************************/
class Adafruit_Sensor {
public:
// Constructor(s)
Adafruit_Sensor() {}
virtual ~Adafruit_Sensor() {}
// These must be defined by the subclass
/**************************************************************************/
/*!
@brief enable or disable auto-ranging for the sensor
@param enabled pass true to enable auto-ranging, false to disable
*/
/**************************************************************************/
virtual void enableAutoRange(bool enabled) {};
/**************************************************************************/
/*!
@brief enable auto-ranging for the sensor
@return true on success, false on failure
*/
/**************************************************************************/
virtual bool getEvent(sensors_event_t*) = 0;
/**************************************************************************/
/*!
@brief get information on the sensor
*/
/**************************************************************************/
virtual void getSensor(sensor_t*) = 0;
private:
bool _autoRange; ///< state of auto-ranging for this sensor. True if enabled, false if disabled
};
#endif