/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _SUCTIONSAMPLER_H
#define _SUCTIONSAMPLER_H

#include <Vk/VkOptionMenu.h>
#include <Vk/VkGenericDialog.h>
#include "DmGuiObject.h"
#include "DynamicLabel.h"
#include "PowerSwitchGui.h"
#include "MomentaryPowerSwitch.h"
#include "ValveControl.h"
#include "ValveSwitchMap.h"
#include "DetritusSampler.h"
#include "Toolsled.h"
#include "BenthicBioDm.h"
#include "SwitchDm.h"
#include "DmText.h"

/*
CLASS 
SetPositionDialog

DESCRIPTION
GUI to specify jar # of current SuctionSampler position index

AUTHOR
Tom O'Reilly
*/
class SetPositionDialog : public VkGenericDialog
{
  public:
  
  SetPositionDialog(const char *name, const char *dmJarNumberName);

  ~SetPositionDialog();

  /* Callback should be public, so application can specify it when posting
     the dialog. */
  static void applyCallback(Widget parent, 
			    XtPointer clientData,
			    XtPointer callData);

  virtual Widget post(const char *msg = NULL,
		      XtCallbackProc okCB = NULL,
		      XtCallbackProc cancelCB = NULL,
		      XtCallbackProc applyCB = NULL,
		      XtPointer clientData = NULL,
		      const char *helpString = NULL,
		      VkSimpleWindow *parent = NULL);
		      
  protected:

  virtual Widget createDialog(Widget parent);
  const char *_dmJarNumberName;
  DmNat16Text *_jarNumber;
};


/*
CLASS 
SuctionSamplerIndex

DESCRIPTION
Display current position index and motion state of SuctionSampler 
carousel. Contains SetPositionDialog object.

AUTHOR
Tom O'Reilly
*/

class SuctionSamplerIndex : public DmGuiObject
{
  public:
  
  SuctionSamplerIndex(const char *name, Widget parent, 
		      const char *appName,             // e.g., "MWSLED"
		      DmBooleanObject *dmIndexSense,
		      DmBooleanObject *dmAutoIndex,
		      DmNat16Object *dmJarNumber,
		      int period);

  ~SuctionSamplerIndex();

  virtual const char *className()
  {
    return "SuctionSamplerIndex";
  }
  
  
  virtual void updateGui(DM_Item handle = NULL);

  virtual void updateFromPeer(DmGuiObject *peer, void *clientData);
  

  protected:


  enum Direction
  {
    Forward, Reverse
  };
  
  void updateCurrent(Direction direction);
  
  // Index indicators
  Pixel _atIndexForeground, _atIndexBackground;
  Pixel _movingForeground, _movingBackground;

  // Switch colors
  Pixel _noPwrForeground, _noPwrBackground;
  Pixel _onForeground, _onBackground;
  Pixel _offForeground, _offBackground;
  Pixel _faultForeground, _faultBackground;

  Widget _index;
  Widget _definePosition;

  Widget _fwdIndex;
  DynamicLabel *_fwdIndexCurrent;
  Widget _revIndex;
  DynamicLabel *_revIndexCurrent;
  
  Widget _autoIndex;

  Pixel _lightEdgeColor, _darkEdgeColor;

  MBool _autoMode;
  
  DmBooleanObject *_dmAutoIndex;
  DmBooleanObject *_dmIndexSense;
  DmNat16Object *_dmJarNumber;
  MBool _prevIndexSense;
  Nat16 _prevJarNumber;

  void toggleAuto(MBool set);
  void startStop(MBool start, Widget w);
  
  SwitchDm *_dmReverse;
  SwitchDm *_dmForward;
  DmInputDetector *_revStatusDetector;
  DmInputDetector *_fwdStatusDetector;

  switchStatus _fwdSwitchStatus;
  switchStatus _revSwitchStatus;

  SetPositionDialog *_setPositionDialog;
  
  private:
  
  static void callback(Widget w, 
		       XtPointer clientData,
		       XtPointer callData);
};


/*
CLASS 
SuctionSamplerPump

DESCRIPTION
Speed and direction control for SuctionSampler pump

AUTHOR
Tom O'Reilly
*/
class SuctionSamplerPump : public DmGuiObject
{
  public:
  
  SuctionSamplerPump(const char *name, Widget parent, 
		     DmInt16Object *dmSpeed,
		     DmEnumObject *dmDirection);

  ~SuctionSamplerPump();

  virtual const char *className()
  {
    return "SuctionSamplerPump";
  }
  
  virtual void updateGui(DM_Item handle = NULL);

  void setSensitive(Boolean sensitive);

  protected:

  Widget _speed;
  Widget _stop, _fwd, _rev;
  
  DmInt16Object *_dmSpeed;
  DmEnumObject *_dmDirection;
  
  Boolean _draggingSpeed;

  void setSpeed(int value);
  void setDirection(PumpDirection direction);
  
  
  static void speedCallback(Widget w,
			    XtPointer clientData,
			    XtPointer callData);

  static void directionCallback(Widget w,
				XtPointer clientData,
				XtPointer callData);

};


/*
CLASS 
SuctionSampler

DESCRIPTION
GUI to control suction-sampler. Contains SuctionSamplerIndex and
SuctionSamplerPump objects.

AUTHOR
Tom O'Reilly
*/
class SuctionSampler : public VkComponent
{
  public:
  
  SuctionSampler(const char *name, Widget parent,
		 const char *appName,                // e.g., "MWSLED"
		 DmBooleanObject *dmAutoIndex,
		 DmBooleanObject *dmIndexSense,
		 DmNat16Object *dmJarNumber,
		 DmInt16Object *dmSpeed,
		 DmEnumObject *dmDirection);

  ~SuctionSampler();

  virtual const char *className()
  {
    return "SuctionSampler";
  }
  
  SuctionSamplerIndex *index;
  SuctionSamplerPump *pump;
  
  protected:
  
  Pixmap _nannyPixmap;
};

#endif

