// sensor.h: interface for the Sensor class.
//
//////////////////////////////////////////////////////////////////////

#ifndef SENSOR_H
#define SENSOR_H

#include "lrstypesC.h"
#include "spectrum.h"
#include "exceptions.h"
#include "lrscfg.h"

#define OUTOFRANGE -1
#define BADTEMPREADING_EXCEPTION 5
#define NUMHOUSEKEEPING_CFGITEMS 4 //CHANGE THIS if cfgline changes

enum cfgline{API_VER, COM_PORT, BASE_ADDR, BIT_MASK};


class VeriteqSensor  
{
public:	
	
	// Constructor and destructor
	VeriteqSensor();
	
	virtual ~VeriteqSensor();

	// Initialize sensor com port 
	// Returns -1 if error intializing sensor due to
	// API date/version mismatch, or com port invalid
	int init(const char *name, LrsCfg *config);

	int sampleTemp(TempType *temp);

	int sampleRelativeHumidity(RhType *rh);
	

private:
	// reads veriteq channel and returns data
	int readChannel(int chan, double *data);
	
	SPT_lStatusCode     _lStatusCode;
	
	// A Veriteq logger object.
	SPT_ulLoggerHandle _ulLoggerHandle; 

	// TRUE if connected to logger
	BOOL _connected;
	
	// logger com port and address
	SPT_lComPortNumber  _lComPortNumber;
	SPT_ulLoggerAddress _ulLoggerAddress;
};

class HousekeepingSensors
{
public:

	HousekeepingSensors(const char *name);

	virtual ~HousekeepingSensors();

	// Initialize sensor array based on cfg info
	// in "lrs.cfg"
	int init(const char *name, LrsCfg *cfg);

	// Data struct for housekeeping sensors
	struct Data {
		TempType temp;
		RhType rh;
		BOOL wateralarm;
	};

	// Returns data in <Housekeeping::Data> struct
	// If error during sampling throws exception 
	// BadReading and fills in sensor array with 
	// OUTOFRANGE reading where reading failed
	void sample(HousekeepingSensors::Data *data);	

	// Samples and returns state of watersensor: true or false
	// Typically called at higher rate than sample above
	BOOL sampleWaterSensor();	

	// Sensor exceptions
	class BadTempReading : public Exception{
	public:
		BadTempReading(const char *descr);
	};	
	// Sensor exceptions
	/*class BadRhReading : public Exception{
	public:
		BadRhReading(const char *descr);
		~BadRhReading();
	};*/	
	
private:
	char *_name;
	VeriteqSensor _vsensor;	 //Veriteq sensor object
	unsigned int _baseaddress; // base address for water alarm reading
	unsigned int _bitmask; //bit mask for water alarm reading
};
#endif // !defined(SENSOR_H)
