#include <Xm/Form.h>
#include <Xm/PushB.h>
#include <Xm/ToggleB.h>
#include <Xm/Label.h>
#include <Xm/ScrollBar.h>
#include "ZoomFocusIris.h"
#include "camera.h"
#include "DmErrno.h"

#define dprintf if (debug) fprintf

const int ZoomFocusIris::ZoomMinimum = 0;
const int ZoomFocusIris::ZoomMaximum = 1000;
const int ZoomFocusIris::FocusMinimum = 0;
const int ZoomFocusIris::FocusMaximum = 1000;
const int ZoomFocusIris::IrisMinimum = 0;
const int ZoomFocusIris::IrisMaximum = 1023;

ZoomFocusIris::ZoomFocusIris(const char *name, Widget parent, 
			     DmInt16Object *dmZoom,
			     DmInt16Object *dmFocus,
			     DmInt16Object *dmIris,
			     DmEmptyObject *dmIrisMode)
  : VkComponent(name)
{
  _baseWidget = XtVaCreateWidget(_name, xmFormWidgetClass, parent,
				 NULL);
  
  installDestroyHandler();

  Widget nameLabel = 
    XtVaCreateManagedWidget("name", xmLabelWidgetClass, _baseWidget, 
			    XmNtopAttachment, XmATTACH_FORM,
			    XmNleftAttachment, XmATTACH_FORM,
			    NULL);
  
  const int sliderSize = 400;
  
  _zoom = 
    XtVaCreateManagedWidget("zoom", xmScrollBarWidgetClass, _baseWidget,
			    XmNorientation, XmVERTICAL, 
			    XmNsliderSize, sliderSize, 
			    XmNminimum, ZoomMinimum,
			    XmNmaximum, ZoomMaximum + sliderSize,
			    XmNprocessingDirection, XmMAX_ON_TOP,
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, nameLabel,
			    XmNleftAttachment, XmATTACH_FORM,
			    NULL);

  XtAddCallback(_zoom, XmNdragCallback, 
		&ZoomFocusIris::sliderChangedCallback,
		(XtPointer )this);

  XtAddCallback(_zoom, XmNvalueChangedCallback, 
		&ZoomFocusIris::sliderChangedCallback,
		(XtPointer )this);

  _focus = 
    XtVaCreateManagedWidget("focus", xmScrollBarWidgetClass, _baseWidget,
			    XmNorientation, XmVERTICAL,
			    XmNsliderSize, sliderSize,  
			    XmNminimum, FocusMinimum,
			    XmNmaximum, FocusMaximum + sliderSize,
			    XmNprocessingDirection, XmMAX_ON_TOP,
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, nameLabel,
			    XmNleftAttachment, XmATTACH_WIDGET,
			    XmNleftWidget, _zoom,
			    NULL);

  XtAddCallback(_focus, XmNdragCallback, 
		&ZoomFocusIris::sliderChangedCallback,
		(XtPointer )this);

  XtAddCallback(_focus, XmNvalueChangedCallback, 
		&ZoomFocusIris::sliderChangedCallback,
		(XtPointer )this);

  _iris = 
    XtVaCreateManagedWidget("iris", xmScrollBarWidgetClass, _baseWidget,
			    XmNorientation, XmVERTICAL,
			    XmNsliderSize, sliderSize,  
			    XmNminimum, IrisMinimum,
			    XmNmaximum, IrisMaximum + sliderSize,
			    XmNprocessingDirection, XmMAX_ON_TOP,
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, nameLabel,
			    XmNleftAttachment, XmATTACH_WIDGET,
			    XmNleftWidget, _focus,
			    NULL);

  XtAddCallback(_iris, XmNdragCallback, 
		&ZoomFocusIris::sliderChangedCallback,
		(XtPointer )this);

  XtAddCallback(_iris, XmNvalueChangedCallback, 
		&ZoomFocusIris::sliderChangedCallback,
		(XtPointer )this);

  Widget label =
    XtVaCreateManagedWidget("zoomLabel", xmLabelWidgetClass, _baseWidget,
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, _zoom,
			    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
			    XmNleftWidget, _zoom,
			    NULL);

  label =
    XtVaCreateManagedWidget("focusLabel", xmLabelWidgetClass, _baseWidget,
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, _focus,
			    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
			    XmNleftWidget, _focus,
			    NULL);

  label =
    XtVaCreateManagedWidget("irisLabel", xmLabelWidgetClass, _baseWidget,
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, _iris,
			    XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET,
			    XmNleftWidget, _iris,
			    NULL);
  
  _autoIris = 
    XtVaCreateManagedWidget("autoIris", xmPushButtonWidgetClass,
			    _baseWidget, 
			    XmNleftAttachment, XmATTACH_FORM,
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, label,
			    NULL);

  XtAddCallback(_autoIris, XmNactivateCallback,
		&ZoomFocusIris::autoIrisCallback,
		(XtPointer )this);
  
  _dmZoom = dmZoom;
  _dmFocus = dmFocus;
  _dmIris = dmIris;
  _dmIrisMode = dmIrisMode;
}


ZoomFocusIris::~ZoomFocusIris()
{
}


void ZoomFocusIris::setZoom(unsigned value)
{
  Boolean debug = False;
  dprintf(stderr, "ZoomFocusIris::setZoom() - value=%d\n", value);
  DM_Time t;
  t.tv_sec = time(NULL);
  t.tv_usec = 0;
  
  Errno err;
  if ((err = _dmZoom->write((Int16 )value, &t)) != SUCCESS)
  {
    char errorBuf[errorMsgSize];
    sprintDmError(err, "ZoomFocusIris::setZoom()", errorBuf);
    setError(errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
    return;
  }
}


void ZoomFocusIris::setFocus(unsigned value)
{
  Boolean debug = False;
  dprintf(stderr, "ZoomFocusIris::setFocus() - value=%d\n", value);
  DM_Time t;
  t.tv_sec = time(NULL);
  t.tv_usec = 0;
  
  Errno err;
  if ((err = _dmFocus->write((Int16 )value, &t)) != SUCCESS)
  {
    char errorBuf[errorMsgSize];
    sprintDmError(err, "ZoomFocusIris::setFocus()", errorBuf);
    setError(errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
    return;
  }
}


void ZoomFocusIris::setIris(unsigned value)
{
  Boolean debug = False;
  dprintf(stderr, "ZoomFocusIris::setIris() - value=%d\n", value);
  DM_Time t;
  t.tv_sec = time(NULL);
  t.tv_usec = 0;
  
  Errno err;
  if ((err = _dmIris->write((Int16 )value, &t)) != SUCCESS)
  {
    char errorBuf[errorMsgSize];
    sprintDmError(err, "ZoomFocusIris::setIris()", errorBuf);
    setError(errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
    return;
  }
}


void ZoomFocusIris::sliderChangedCallback(Widget w, XtPointer clientData,
					  XtPointer callData)
{
  ZoomFocusIris *obj = (ZoomFocusIris *)clientData;
  if (w == obj->_zoom)
  {
    obj->setZoom(((XmScrollBarCallbackStruct *)callData)->value);
  }
  else if (w == obj->_focus)
  {
    obj->setFocus(((XmScrollBarCallbackStruct *)callData)->value);
  }
  else if (w == obj->_iris)
  {
    obj->setIris(((XmScrollBarCallbackStruct *)callData)->value);
  }
}



void ZoomFocusIris::autoIrisCallback(Widget w, XtPointer clientData,
				     XtPointer callData)
{
  static struct timezone tz = 
  {
    0, 0
  };
  
  ZoomFocusIris *obj = (ZoomFocusIris *)clientData;
  
  DM_Time t;
  gettimeofday(&t, &tz);
  
  Errno errno;
  
  if ((errno = obj->_dmIrisMode->write(&t)) != SUCCESS)
  {
  }
  
}


