#ifndef POWERSENSOR_H_
#define POWERSENSOR_H_

#include <framework/datapool/DataSet.h>
#include <framework/datapool/PIDReader.h>
#include <framework/datapool/PoolVariable.h>
#include <framework/devicehandlers/HealthDevice.h>
#include <framework/monitoring/LimitMonitor.h>
#include <framework/parameters/ParameterHelper.h>
#include <framework/objectmanager/SystemObject.h>
#include <framework/ipc/MessageQueueIF.h>

class PowerController;

class PowerSensor: public SystemObject,
		public ReceivesParameterMessagesIF,
		public HasHealthIF {
	friend class PowerController;
public:
	struct VariableIds {
		uint32_t pidCurrent;
		uint32_t pidVoltage;
		uint32_t poolIdPower;
	};
	struct DefaultLimits {
		float currentMin;
		float currentMax;
		float voltageMin;
		float voltageMax;
	};
	struct SensorEvents {
		Event currentLow;
		Event currentHigh;
		Event voltageLow;
		Event voltageHigh;
	};
	PowerSensor(object_id_t setId, VariableIds setIds, DefaultLimits limits,
			SensorEvents events, uint16_t confirmationCount = 0);
	virtual ~PowerSensor();
	ReturnValue_t calculatePower();
	ReturnValue_t performOperation(uint8_t opCode);
	void setAllMonitorsToUnchecked();
	MessageQueueId_t getCommandQueue() const;
	ReturnValue_t initialize();
	void setDataPoolEntriesInvalid();
	float getPower();
	ReturnValue_t setHealth(HealthState health);
	HasHealthIF::HealthState getHealth();
	ReturnValue_t getParameter(uint8_t domainId, uint16_t parameterId,
			ParameterWrapper *parameterWrapper,
			const ParameterWrapper *newValues, uint16_t startAtIndex);
private:
	MessageQueueIF* commandQueue;
	ParameterHelper parameterHelper;
	HealthHelper healthHelper;
	DataSet set;
	//Variables in
	PIDReader<float> current;
	PIDReader<float> voltage;
	//Variables out
	db_float_t power;

	static const uint8_t MODULE_ID_CURRENT = 1;
	static const uint8_t MODULE_ID_VOLTAGE = 2;
	void checkCommandQueue();
protected:
	LimitMonitor<float> currentLimit;
	LimitMonitor<float> voltageLimit;
};

#endif /* POWERSENSOR_H_ */