/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _MAINCAMERA_H
#define _MAINCAMERA_H

#include "IviewMonitor.h"
#include "DmGuiObject.h"
#include "DynamicLabel.h"
#include "DmInputDetector.h"
#include "IviewControl.h"

class CameraSetupDialog;

/*
CLASS 
MainCamera

DESCRIPTION
Zoom, focus and iris control, for an Iview camera

AUTHOR
Tom O'Reilly
*/
class MainCamera : public DmGuiObject
{
  public:

  enum CameraType {

    PanasonicWV,
    SonyHDTV

  };


  MainCamera(const char *name, Widget parent, 
	     CameraType type,
	     const char *dmPrefix,
	     IviewDevice cameraDevice,
	     int period, IviewMonitor *monitor);

  ~MainCamera();
  
  virtual const char *className()
  {
    return "MainCamera";
  }

  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;
  
  enum ZoomMode
  {
    Position, Rate
  };
  
  int _zoomMode;
  
  char *_dmPrefix;
  Widget _zoom;
  Widget _focus;
  Widget _iris;
  Widget _zoomLabel;
  Widget _focusLabel;
  Widget _irisLabel;
  Widget _useIndicator;
  
  DynamicLabel *_zoomSetPoint;
  DynamicLabel *_zoomValue;
  DynamicLabel *_focusSetPoint;
  DynamicLabel *_focusValue;
  DynamicLabel *_irisValue;
  
  DmInt16Object *_dmZoomValue;
  DmInt16Object *_dmZoomSetPoint;  
  DmInt16Object *_dmZoomMode;  
  DmInt16Object *_dmFocusValue;  
  DmInt16Object *_dmFocusSetPoint;  
  DmInt16Object *_dmIrisValue;  
  DmInt16Object *_dmIrisMode;
  
  DmInputDetector *_irisModeDetector;
  DmInputDetector *_zoomModeDetector;
  DmInputDetector *_iviewMsgDetector;
  Boolean _autoIris;
  
  void setZoom(unsigned value);
  void setFocus(unsigned value);
  void setIris(unsigned value);
  void updateSetPoint(Widget w, unsigned value);

  int startControl(ControlType controlType);
  int stopControl(ControlType controlType);
  void startTimer();
  void stopTimer();
  
  
  Int16 _prevZoomSetPoint;
  Int16 _prevZoomValue;
  Int16 _prevFocusSetPoint;
  Int16 _prevFocusValue;
  Int16 _prevIrisValue;

  IviewControl *_iviewControl;
  IviewDevice _camera;
  unsigned short _devices;
  
  CameraSetupDialog *_dialog;

  XtIntervalId _statusTimer;
  
  void checkIviewStatus();
  void setUseIndicator(Boolean inUse);
  
  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;

  IviewMonitor *_monitor;

  CameraType _cameraType;

  private:

  static void timerCallback(XtPointer clientData, XtIntervalId *id);

  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 setupCallback(Widget w,
			    XtPointer clientData, XtPointer callData);
  
};



#endif
