//////////////////////////////////////////////////////////////////////
// LrsSampler.cpp: implementation of the LrsSampler class.
//
//////////////////////////////////////////////////////////////////////
#include "lrsapp.h"
#include "lrssampler.h"
#include "microapp.h"
#include "sensor.h"
#include "errorlog.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

LrsSampler::LrsSampler(const char *name, LrsApp *pApp)	
	: MicroPeriodicHandler(name, pApp->_taskSync),
	_waterAlarmElectHousing("Electronics housing water alarm",5, 20),
	_waterAlarmSpectHousing("Spectrograph housing water alarm",5, 20),	
	_cbHousekeeping(newCallback(*(this), &LrsSampler::sampleAllSensors)),
	_cbWaterAlarm(newCallback(*(this), &LrsSampler::sampleWaterSensors))
{
	_pSensor[ELECTRONICS_HOUSING] = 0;
	_pSensor[SPECTROGRAPH_HOUSING] = 0;

	_pSensor[ELECTRONICS_HOUSING] = pApp->_pElectronicsSensor;
	_pSensor[SPECTROGRAPH_HOUSING] = pApp->_pSpectrographSensor;
	addCallback((Nat32) HOUSEKEEPING_SAMPLE_PERIOD, &_cbHousekeeping);
	addCallback((Nat32) WATER_SAMPLE_PERIOD, &_cbWaterAlarm);
	_pSupplier = pApp->_pSupplier;

}
LrsSampler::~LrsSampler()
{
 
}


void LrsSampler::sampleAllSensors(CallbackObject *obj)
{
	CORBA::Any any;	
	HousekeepingSensors::Data data;
	LRS::HousekeepingData ecdata; //event channel data

	if(!_pSensor[ELECTRONICS_HOUSING])
		return;

	//Sample and populate data struct with sensors readings
	_pSensor[ELECTRONICS_HOUSING]->sample(&data);
	
	ecdata.id = ELECTRONICS_HOUSING;
	ecdata.temp = data.temp;
	ecdata.rh = data.rh;
	ecdata.readingTime = Clock::getgmTime();	  
	ecdata.wateralarm = data.wateralarm;

	any <<= ecdata;

	_pSupplier->queue_event(any);

	if(!_pSensor[SPECTROGRAPH_HOUSING])
		return;

	//Sample and populate data struct with sensors readings
	_pSensor[SPECTROGRAPH_HOUSING]->sample(&data);
	
	ecdata.id = SPECTROGRAPH_HOUSING;
	ecdata.temp = data.temp;
	ecdata.rh = data.rh;
	ecdata.readingTime = Clock::getgmTime();	  
	ecdata.wateralarm = data.wateralarm;

	any <<= ecdata;

	_pSupplier->queue_event(any);

}
void LrsSampler::sampleWaterSensors(CallbackObject *obj)
{
	CORBA::Any any;	
	HousekeepingSensors::Data data;
	LRS::HousekeepingData ecdata;

	if(!_pSensor[ELECTRONICS_HOUSING])
		return;

	//Sample and check for water alarm
	if(_pSensor[ELECTRONICS_HOUSING]->sampleWaterSensor() == TRUE) {

		// Run detection algorithm
		_waterAlarmElectHousing.detect();

		// If water alarm is active
		if(_waterAlarmElectHousing.isActive()) {
			
			//Sample and populate data struct with sensors readings
			_pSensor[ELECTRONICS_HOUSING]->sample(&data);
			ecdata.id = ELECTRONICS_HOUSING;
			ecdata.temp = data.temp;
			ecdata.rh = data.rh;
			ecdata.readingTime = Clock::getgmTime();	  
			ecdata.wateralarm = data.wateralarm;
			any <<= ecdata;
			_pSupplier->queue_event(any);

			ErrorLog::logError("Electronics housing water alarm");
		}
	}

	if(!_pSensor[SPECTROGRAPH_HOUSING])
		return;

	//Sample and check for water alarm
	if(_pSensor[SPECTROGRAPH_HOUSING]->sampleWaterSensor() == TRUE) {

		// Run detection algorithm
		_waterAlarmSpectHousing.detect();

		// If water alarm is active
		if(_waterAlarmSpectHousing.isActive()) {
			
			//Sample and populate data struct with sensors readings
			_pSensor[SPECTROGRAPH_HOUSING]->sample(&data);
			ecdata.id = SPECTROGRAPH_HOUSING;
			ecdata.temp = data.temp;
			ecdata.rh = data.rh;
			ecdata.readingTime = Clock::getgmTime();	  
			ecdata.wateralarm = data.wateralarm;
			any <<= ecdata;
			_pSupplier->queue_event(any);

			ErrorLog::logError("Spectrograph housing water alarm");
		}
	}
	
}