#ifndef _HEADINGCONTROL_H
#define _HEADINGCONTROL_H

#include "DmGuiObject.h"
#include "ErrorHandler.h"
#include "DataManager.h"
#include "State.h"

class HeadingControlBase : public DmGuiObject
{
  public:

  HeadingControlBase(const char *name, Widget parent); 

  ~HeadingControlBase();
  
  virtual const char *className()
  {
    return "HeadingControlBase";
  }

  protected:

  Widget _cwButton;
  Widget _ccwButton;
  XtIntervalId _timer;
  int _sense;
  
  virtual int setHeading() = 0;

  Flt32 _heading;
  
  private:
  static void callback(Widget w, XtPointer clientData, XtPointer callData);
  static void timerCallback(XtPointer clientData, XtIntervalId *id);
  
};


class HeadingControl : public HeadingControlBase
{
  public:

  HeadingControl(const char *name, Widget parent, 
		 const char *dmItemName, Boolean inDegrees);
  
  ~HeadingControl();
  
  virtual const char *className()
  {
    return "HeadingControl";
  }
  
  virtual void updateGui(DM_Item handle = 0);

  protected:
  
  virtual int setHeading();

  DmFlt32Object *_dmHeading;

  Boolean _inDegrees;

};



class RovHeadingControl : public HeadingControlBase
{
  public:

  RovHeadingControl(const char *name, Widget parent);
  
  ~RovHeadingControl();
  
  virtual const char *className()
  {
    return "RovHeadingControl";
  }
  
  virtual void updateGui(DM_Item handle = 0);

  protected:
  
  virtual int setHeading();

  DmAttitudeObject *_dmAttitude;

  StateValue _state[6];
  
};



#endif
