#ifndef _SR_SENSOR_H_
#define _SR_SENSOR_H_


#include "sr_device.h"

typedef  struct SR_SENSOR_DEV SR_SENSOR_DEV_T;
typedef  struct SR_SENSOR_DATA SR_SENSOR_DATA_T;


/** @defgroup SR_SENSOR_TYPE  传感器类型
  * @{
  */
#define SR_SENSOR_TYPE_NONE      (0)
#define SR_SENSOR_TYPE_ACCE      (1)  /* Accelerometer     */
#define SR_SENSOR_TYPE_GYRO      (2)  /* Gyroscope         */
#define SR_SENSOR_TYPE_MAG       (3)  /* Magnetometer      */
#define SR_SENSOR_TYPE_TEMP      (4)  /* Temperature       */
#define SR_SENSOR_TYPE_HUMI      (5)  /* Relative Humidity */
#define SR_SENSOR_TYPE_BARO      (6)  /* Barometer         */
#define SR_SENSOR_TYPE_LIGHT     (7)  /* Ambient light     */
#define SR_SENSOR_TYPE_PROXIMITY (8)  /* Proximity         */
#define SR_SENSOR_TYPE_HR        (9)  /* Heart Rate        */
#define SR_SENSOR_TYPE_TVOC      (10) /* TVOC Level        */
#define SR_SENSOR_TYPE_NOISE     (11) /* Noise Loudness    */
#define SR_SENSOR_TYPE_STEP      (12) /* Step sensor       */
#define SR_SENSOR_TYPE_FORCE     (13) /* Force sensor      */
#define SR_SENSOR_TYPE_ALTI      (14) /* Altitude sensor   */
#define SR_SENSOR_TYPE_IR        (15) /* IR intensity sensor   */
/**
  * @}
  */

typedef struct SR_3AXIS_T
{
    int32_t x;
    int32_t y;
    int32_t z;
}SR_3AXIS_T;

struct SR_SENSOR_DATA
{
    uint8_t  type;            /*!< 传感器类型,可选值@ref SR_SENSOR_TYPE     */
    union
    {
        SR_3AXIS_T acce;      /*!< Accelerometer.       unit: mG          */
        SR_3AXIS_T gyro;      /*!< Gyroscope.           unit: mdps        */
        SR_3AXIS_T mag;       /*!< Magnetometer.        unit: mGauss      */
        int32_t    temp;      /*!< Temperature.         unit: dCelsius    */
        int32_t    humi;      /*!< Relative humidity.   unit: permillage  */
        int32_t    baro;      /*!< Pressure.            unit: pascal (Pa) */
        int32_t    light;     /*!< Light.               unit: lux         */
        int32_t    proximity; /*!< Distance.            unit: centimeters */
        int32_t    hr;        /*!< Heart rate.          unit: bpm         */
        int32_t    tvoc;      /*!< TVOC.                unit: permillage  */
        int32_t    noise;     /*!< Noise Loudness.      unit: HZ          */
        uint32_t   step;      /*!< Step sensor.         unit: 1           */
        int32_t    force;     /*!< Force sensor.        unit: mN          */
        int32_t    alti;      /*!< Altitude sensor.     unit: m           */
    } data;
};



struct SR_SENSOR_DEV
{
    SR_DEVICE_T parent;   /*! 设备公共父类*/ 
    uint8_t  type;        /*! 传感器类型，可选值@ref SR_SENSOR_TYPE */
    int (*irqHandle)(SR_DEVICE_T *dev,uint16_t size); /*! 中断回调函数*/
};


int SR_HalSensorRegister(SR_SENSOR_DEV_T *dev, const char *name, SR_DEVICE_OPS_T *ops,void *data);

SR_DEVICE_T *SR_HalSensorOpen(const char *name);

#define SR_HalSensorClose(dev)            SR_DeviceClose(dev)
#define SR_HalSensorRead(dev,buff,num)    SR_DeviceRead(dev,0, buff,num)
#define SR_HalSensorCtrl(dev,cmd,arg)     SR_DeviceControl(dev,cmd,arg)

#endif
