/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _DRILLSLEDGUI_H
#define _DRILLSLEDGUI_H
#include <Vk/VkOptionMenu.h>
#include "DmGuiObject.h"
#include "DynamicLabel.h"
#include "PowerSwitchGui.h"
#include "MomentaryPowerSwitch.h"
#include "ValveControl.h"
#include "ValveSwitchMap.h"
#include "ValveFunctions.h"
#include "GeoDm.h"
#include "ValveSwitchMap.h"
#include "SwitchDm.h"
#include "HydraulicSelect.h"
#include "SuctionSampler.h"
#include "DmSlider.h"
#include "DmBooleanSwitch.h"
#include "DmBooleanIndicator.h"
#include "FireControl.h"
#include "SuctionSampler.h"
#include "DrillSledDm.h"
#include "DmBarGraph.h"

class DrillSledGui;

/*
CLASS 
BitSpeedControl

DESCRIPTION
Control drillbit speed

AUTHOR
Tom O'Reilly
*/
class BitSpeedControl : public DmGuiObject {

public:

  BitSpeedControl(const char *name, Widget parent, DrillSledDm *dmObjects);

  ~BitSpeedControl();

  virtual const char *className()
  {
    return "BitSpeedControl";
  }
  
  virtual void updateGui(DM_Item handle = NULL);

protected:

  void setRotationSense(DrillSledDm::RotationSense direction);

  Widget _speed;
  Widget _stop, _fwd, _rev;

  DrillSledDm *_dmObjects;
  Boolean _draggingSpeed;
  void setSpeed(int value);

  static void speedCallback(Widget w,
			    XtPointer clientData,
			    XtPointer callData);

  static void directionCallback(Widget w,
				XtPointer clientData,
				XtPointer callData);

};


/*
CLASS 
DrillSledPower

DESCRIPTION
Contains DrillSled PowerSwitchGui objects

AUTHOR
Tom O'Reilly
*/
class DrillSledPower : public VkComponent
{
  public:

  DrillSledPower(const char *name, Widget parent, 
		 DrillSledGui *drillSledGui, const char *platformName);

  ~DrillSledPower();
  
  virtual const char *className()
  {
    return "DrillSledPower";
  }


  protected:
  
  PowerSwitchGui *_wobTransducer;
  PowerSwitchGui *_torqueTransducer;
  PowerSwitchGui *_rotationSensor;
  PowerSwitchGui *_servoValves;
  PowerSwitchGui *_hydraulicValves;
  PowerSwitchGui *_science24v;
  PowerSwitchGui *_camera1;
  PowerSwitchGui *_camera2;
  PowerSwitchGui *_ssPump;

  // Called when power switch status changes
  void statusCallback(VkCallbackObject *obj,
		      void *clientData,
		      void *callData);

  DrillSledGui *_drillSledGui;

  char *_wobLabel;
  char *_torqueLabel;
  char *_rotationLabel;
  char *_servoValveLabel;
  char *_hydraulicValveLabel;
  char *_science24vLabel;
  char *_camera1Label;
  char *_camera2Label;
  char *_ssPumpLabel;

private:

  static XtResource _resources[];
};


/*
CLASS 
DrillSledTelemetry

DESCRIPTION
Telemetry display for DrillSled 

AUTHOR
Tom O'Reilly
*/
class DrillSledTelemetry : public VkComponent {

public:

  DrillSledTelemetry(const char *name, Widget parent, 
		     DrillSledDm *dmObjects);

  ~DrillSledTelemetry();

protected:

  DrillSledDm *_dmObjects;
  DmFlt32BarGraph *_weightOnBit;
  DmFlt32BarGraph *_motorDeltaP;
  DmFlt32BarGraph *_drillRpm;
  DmFlt32BarGraph *_cutterVoltage;
};



/*
CLASS 
DrillSledGui

DESCRIPTION
Controls/displays for DrillSled 

AUTHOR
Tom O'Reilly
*/
class DrillSledGui : public VkComponent
{

public:

  DrillSledGui(const char *name, Widget parent, const char *platformDmPrefix);
  ~DrillSledGui();

  virtual const char *className()
  {
    return "DrillSledGui";
  }

  DrillSledPower *power;
  ValveFunctions *valveFunctions;
  HydraulicSelect *coreHydraulics;
  SuctionSamplerPump *waterPump;

protected:

  DmBooleanSwitch *_torqueSelect;
  ValveControl **_valveControl;
  ValveSwitchMap *_switchMap;
  DrillSledTelemetry *_telemetry;
  BitSpeedControl *_bitSpeedControl;
  FireControl *_fireControl;

  DrillSledDm *_dmObjects;

};



#endif
