/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2008. All Rights Reserved.							  */
/* Open Source Software - may be modified and shared by FRC teams. The code   */
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
/*----------------------------------------------------------------------------*/

#ifndef DIGITAL_OUTPUT_H_
#define DIGITAL_OUTPUT_H_

#include "DigitalSource.h"

class DigitalModule;

/**
 * Class to write to digital outputs.
 * Write values to the digital output channels. Other devices implemented elsewhere will allocate
 * channels automatically so for those devices it shouldn't be done here.
 */
class DigitalOutput : public DigitalSource
{
public:
	explicit DigitalOutput(UINT32 channel);
	DigitalOutput(UINT32 slot, UINT32 channel);
	virtual ~DigitalOutput();
	void Set(UINT32 value);
	UINT32 GetChannel();
	void Pulse(float length);
	bool IsPulsing();
	void SetPWMRate(float rate);
	void EnablePWM(float initialDutyCycle);
	void DisablePWM();
	void UpdateDutyCycle(float dutyCycle);

	// Digital Source Interface
	virtual UINT32 GetChannelForRouting();
	virtual UINT32 GetModuleForRouting();
	virtual bool GetAnalogTriggerForRouting();
	virtual void RequestInterrupts(tInterruptHandler handler, void *param);
	virtual void RequestInterrupts();

	void SetUpSourceEdge(bool risingEdge, bool fallingEdge);

private:
	void InitDigitalOutput(UINT32 slot, UINT32 channel);

	UINT32 m_channel;
	UINT32 m_pwmGenerator;
	DigitalModule *m_module;
};

#endif
