#ifndef _MIDWATERGUI_H
#define _MIDWATERGUI_H
#include <Vk/VkOptionMenu.h>
#include "DmGuiObject.h"
#include "DynamicLabel.h"
#include "PowerSwitchGui.h"
#include "MomentaryPowerSwitch.h"
#include "ValveControl.h"
#include "ValveSwitchMap.h"
#include "DetritusSampler.h"
#include "MidwaterDm.h"
#include "ValveSwitchMap.h"
#include "SwitchDm.h"
#include "HydraulicSelect.h"

// Valves per swingarm
#define NValvesPerSwingArm 4


class SwingArm : public DmGuiObject
{
  public:

  enum Side
  {
    PortSide, StbdSide
  };
  
  SwingArm(const char *name, Widget parent, Side side, MidwaterDm *dmItems);
  ~SwingArm();
  
  virtual const char *className()
  {
    return "SwingArm";
  }
  
  virtual void updateGui(DM_Item handle = NULL);

  DetritusSamplerValves *valves;


  protected:

  DynamicLabel *_position;
  MomentaryPowerSwitch *_deploy;
  MomentaryPowerSwitch *_stow;

  DmInt16Object *_dmPosition;
  
};


class SwingArms : public VkComponent
{
  public:
  
  SwingArms(const char *name, Widget parent, MidwaterDm *dmItems);
  ~SwingArms();
  
  virtual const char *className()
  {
    return "SwingArms";
  }
  
  SwingArm *portSwingArm;
  SwingArm *stbdSwingArm;
};


 
class SuctionSamplerIndex : public DmGuiObject
{
  public:
  
  SuctionSamplerIndex(const char *name, Widget parent, MidwaterDm *dmItems,
		      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 _indexSense;

  Widget _fwdIndex;
  DynamicLabel *_fwdIndexCurrent;
  Widget _revIndex;
  DynamicLabel *_revIndexCurrent;
  
  Widget _autoIndex;

  Pixel _lightEdgeColor, _darkEdgeColor;

  MBool _autoMode;
  
  DmBooleanObject *_dmAutoIndex;
  DmBooleanObject *_dmIndexSense;
  MBool _prevIndexSense;
  
  void toggleAuto(MBool set);
  void startStop(MBool start, Widget w);
  
  SwitchDm *_dmReverse;
  SwitchDm *_dmForward;
  DmInputDetector *_revStatusDetector;
  DmInputDetector *_fwdStatusDetector;

  switchStatus _fwdSwitchStatus;
  switchStatus _revSwitchStatus;
  
  private:
  
  static void callback(Widget w, 
		       XtPointer clientData,
		       XtPointer callData);
};


class SuctionSamplerPump : public DmGuiObject
{
  public:
  
  SuctionSamplerPump(const char *name, Widget parent, MidwaterDm *dmItems);
  ~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(MidwaterDm::PumpDirection direction);
  
  private:
  
  static void speedCallback(Widget w,
			    XtPointer clientData,
			    XtPointer callData);

  static void directionCallback(Widget w,
				XtPointer clientData,
				XtPointer callData);

};


class SuctionSampler : public VkComponent
{
  public:
  
  SuctionSampler(const char *name, Widget parent, MidwaterDm *dmItems);
  ~SuctionSampler();

  virtual const char *className()
  {
    return "SuctionSampler";
  }
  
  SuctionSamplerIndex *index;
  SuctionSamplerPump *pump;
  
  protected:
  
  Pixmap _nannyPixmap;
};


class MidwaterGui;


class MidwaterPower : public VkComponent
{
  public:

  MidwaterPower(const char *name, Widget parent, MidwaterGui *midwaterGui);
  ~MidwaterPower();
  
  virtual const char *className()
  {
    return "MidwaterPower";
  }

  PowerSwitchGui *pump;
  PowerSwitchGui *incandLight;
  PowerSwitchGui *arm;
  PowerSwitchGui *armPositionSensor;
  PowerSwitchGui *indexSensor;
  PowerSwitchGui *pencilCamera;
  PowerSwitchGui *acm;

  protected:
  
  // Called when power switch status changes
  void statusCallback(VkCallbackObject *obj,
		      void *clientData,
		      void *callData);

  MidwaterGui *_midwaterGui;
};


class MidwaterGui : public VkComponent
{
  public:

  MidwaterGui(const char *name, Widget parent);
  ~MidwaterGui();

  virtual const char *className()
  {
    return "MidwaterGui";
  }

  MidwaterPower *power;
  SwingArms *swingArms;
  SuctionSampler *suctionSampler;
  HydraulicSelect *hydraulicSelect;
  
  protected:

  ValveControl **_valveControl;
  ValveSwitchMap *_switchMap;
  MidwaterDm *_dmItems;
};



#endif
