#ifndef __SENSOR_H__
#define __SENSOR_H__

//
// Sensor ID's (maximum 8)
//

#define SENSOR_ID_PRESSURE     (0)
#define SENSOR_ID_TEMPERATURE  (1)
#define SENSOR_ID_HUMIDITY     (2)
#define SENSOR_ID_GFLOWSIDE    (3)
#define SENSOR_ID_GFHIGHSIDE   (4)
#define SENSOR_ID_HEADING      (5)
#define SENSOR_ID_TURNS_COUNT  (6)
#define SENSOR_ID_COUNTDOWN    (7)

#define SENSOR_NUM_SENSORS     (8)
#define SENSOR_ID_MAXID        (SENSOR_NUM_SENSORS-1)


//
// Flags to indicate sensor properties
//
#define SENSOR_FLAGS_USERMASK  (0x01) // flags the user can set

#define SENSOR_FLAGS_NODATA    (0x01) // sensor doesn't produce data
#define SENSOR_FLAGS_DATAVALID (0x02) // data is valid
#define SENSOR_FLAGS_LEVELSOK  (0x04) // data limits are valid
#define SENSOR_FLAGS_UNUSED0   (0x08)
#define SENSOR_FLAGS_UNUSED1   (0x10)
#define SENSOR_FLAGS_UNUSED2   (0x20)
#define SENSOR_FLAGS_UNUSED3   (0x40)
#define SENSOR_FLAGS_UNUSED4   (0x80)

//
// States to indicate current alarm status of sensor
//
#define SENSOR_STATE_UNARMED   (1)
#define SENSOR_STATE_ARMED     (2)
#define SENSOR_STATE_TRIGGERED (3)
#define SENSOR_STATE_INITIAL   (SENSOR_STATE_UNARMED)

typedef int (*sensorSampleMethod)(float *);

typedef struct {
  unsigned char curState;
  unsigned char prevState;
  unsigned char flags;
  float levelHi;
  float levelLo;
  float lastValue;
  sensorSampleMethod method;
} sensorState;

#define SENSOR_ID_TO_MASK(i) (unsigned char)(0x1 << (i))

int sensorInit(void);
int sensorRegisterSampleMethod(int sensorId, unsigned char flags, sensorSampleMethod method);
int sensorGetData(int sensorId, float * pValue);
int sensorGetLevel(int levelId, float * pLevel);
int sensorSetLevel(int levelId, float level);
int sensorTriggerAlarm(int sensorId);

#endif /* __SENSOR_H__ */
