/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _CAMERA_H
#define _CAMERA_H

#include "CameraInterface.h"
#include "DmGuiObject.h"
#include "DynamicLabel.h"
#include "DmInputDetector.h"

/*
CLASS 
Camera

DESCRIPTION
Zoom, focus and iris control, for a camera

AUTHOR
Tom O'Reilly
*/
class Camera : public DmGuiObject
{
  public:

  Camera(const char *name, Widget parent, 
	 const char *dmPrefix, Period period);

  ~Camera();
  
  virtual const char *className()
  {
    return "Camera";
  }

  static const int ZoomMinimum;
  static const int ZoomMaximum;
  static const int FocusMinimum;
  static const int FocusMaximum;
  static const int IrisMinimum;
  static const int IrisMaximum;
  static const int LowGain;
  static const int MedGain;
  static const int HighGain;
  
  virtual void updateGui(DM_Item handle = 0);

  virtual void updateFromPeer(DmGuiObject *peer, XtPointer clientData);

  virtual int startConsume();
  virtual int stopConsume();

  const char *dmPrefix()
  {
    return _dmPrefix;
  }
  
  protected:

  typedef enum 
  {
    ZoomControl, FocusControl, IrisControl

  } ControlType;
  
  CameraZoomMode _zoomMode;
  
  char *_dmPrefix;
  Widget _zoom;
  Widget _focus;
  Widget _iris;
  Widget _useIndicator;
  Widget _grabRelease;

  DynamicLabel *_rawZoomSetpoint;
  DynamicLabel *_rawZoomValue;
  DynamicLabel *_rawFocusSetpoint;
  DynamicLabel *_rawFocusValue;
  DynamicLabel *_rawIrisValue;
  DynamicLabel *_focalDistance;
  DynamicLabel *_zoomAngle;
  DynamicLabel *_fovWidth;

  DmInputDetector *_zoomModeDetector;
  
  void setZoom(unsigned value);
  void setFocus(unsigned value);
  void setIris(unsigned value);
  void updateSetpoint(Widget w, unsigned value);
  void checkUsage();

  int startControl(ControlType controlType);
  int stopControl(ControlType controlType);
  
  Int16 _prevZoomSetpoint;
  Int16 _prevZoomValue;
  Int16 _prevFocusSetpoint;
  Int16 _prevFocusValue;
  Int16 _prevIrisValue;
  Flt64 _prevFieldWidthValue;
  Flt64 _prevFocalDistanceValue;
  Flt64 _prevZoomAngleValue;

  CameraInterface *_interface;

  void setUseIndicator(Boolean inUse);
  void grabInterface();
  void releaseInterface();
  void activateControls(Boolean activate);

  MBool _prevUsed;
  
  // Indicator colors of when device is being used by another IviewControl
  Pixel _usedForeground, _usedBackground;
  Pixel _unusedForeground, _unusedBackground;

  Boolean _focusing;
  Boolean _zooming;
  Boolean _irising;

  private:

  static void exposeCallback(Widget w, XtPointer clientData,
			     XEvent *event);

  static void valueChangingCallback(Widget w, 
				    XtPointer clientData, 
				    XtPointer callData);

  static void valueChangedCallback(Widget w, 
				   XtPointer clientData, 
				   XtPointer callData);

  static void grabReleaseCallback(Widget w, 
				  XtPointer clientData, 
				  XtPointer callData);
};



#endif
