/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _PANTILTCONTROL_H
#define _PANTILTCONTROL_H
#include <Vk/VkOptionMenu.h>
#include "IviewControl.h"
#include "DmGuiObject.h"
#include "PanTiltButton.h"
#include "IviewMonitor.h"

#define HighTiltRate 1.
#define LowTiltRate 0.25
#define HighPanRate 1.
#define LowPanRate 0.25

#define NIviewDevices 4

/*
CLASS 
PanTiltControl

DESCRIPTION
GUI to control Iview pan-tilt values

AUTHOR
Tom O'Reilly
*/
class PanTiltControl : public DmGuiObject
{
  public:

  PanTiltControl(const char *name, Widget parent, IviewMonitor *monitor);

  ~PanTiltControl();

  virtual const char *className()
  {
    return "PanTiltControl";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  virtual int startConsume();
  virtual int stopConsume();
  
  protected:
  Widget _coarseUp;
  Widget _fineUp;
  Widget _coarseDown;
  Widget _fineDown;
  Widget _coarseRight;
  Widget _fineRight;
  Widget _coarseLeft;
  Widget _fineLeft;

  PanTiltButton *_portLight;
  PanTiltButton *_portCamera;
  PanTiltButton *_stbdLight;
  PanTiltButton *_stbdCamera;

  void toggleDevice(Widget w);

  IviewControl *_iviewControl;
  IviewMonitor *_monitor;
  
  unsigned short _devices;
  unsigned short _reqDevices;
  
  void startMoving(Widget w);
  void stopMoving(Widget w);

  void startTimer();
  void stopTimer();
  XtIntervalId _statusTimer;
  
  static Pixmap _coarseLeftImage, _fineLeftImage;
  static Pixmap _coarseRightImage, _fineRightImage;
  static Pixmap _coarseUpImage, _fineUpImage; 
  static Pixmap _coarseDownImage, _fineDownImage;

  Pixel _offForeground, _offBackground;
  Pixel _onForeground, _onBackground;
  Pixel _stolenForeground, _stolenBackground;
  
  DmObject *_msgObj;
  int _msgNo;
  
  void setButtonStates();
  
  private:
  static void deviceToggleCallback(Widget w,
				   XtPointer clientData,
				   XtPointer callData);
  
  static void controlPressCallback(Widget w, XtPointer clientData, 
				   XtPointer callData); 

  static void controlReleaseCallback(Widget w, XtPointer clientData, 
				     XtPointer callData); 

  static void timerCallback(XtPointer clientData, XtIntervalId *id);
  
};


#endif
