#ifndef _ADVCONTROL_H
#define _ADVCONTROL_H

#include <Vk/VkOptionMenu.h>
#include "DmGuiObject.h"
#include "PowerSwitchGui.h"
#include "ComboTextField.h"
#include "CircularQueue.h"

#define MaxStoredResponses 20

struct AdvCommand
{
  char *mnemonic;
  char *description;
};


/*
Controls for Acoustic Doppler Velocimeter 
*/
class AdvControl : public DmGuiObject
{
  public:
  
  AdvControl(const char *name, Widget parent);
  ~AdvControl();

  virtual const char *className()
  {
    return "AdvControl";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  ComboTextField *_command;
  Widget _commandLabel;
  Widget _responses;
  PowerSwitchGui *_power;
  Widget _startPinging;
  Widget _stopPinging;
  VkOptionMenu *_mode;
 
  // Remember last response time
  double _lastResponseTime;

  // Responses to commands
  CircularQueue<char *> *_responseQueue;
  
  DmStringObject *_dmCommand;
  DmStringObject *_dmResponse;
  DmBooleanObject *_dmPing;
  DmEmptyObject *_dmStopPing;
  
  int startPinging();
  int stopPinging();
  MBool _pinging;

  switchStatus _powerStatus;
  
  void powerStateCallback(VkCallbackObject *obj,
			  void *clientData,
			  void *callData);
  
  // Write ADV instrument command to data manager
  void writeCommand(VkCallbackObject *obj,
		    void *clientData,
		    void *callData);

  // Strip comments from command selected from ComboBox list
  void commandSelectCallback(VkCallbackObject *obj,
			     XtPointer clientData,
			     XtPointer callData);
  
  private:
  
  static AdvCommand _commands[];

  static VkMenuDesc _modeMenuDesc[];
  
  static void startPingCallback(Widget w, XtPointer clientData,
				XtPointer callData);
  
  static void stopPingCallback(Widget w, XtPointer clientData,
			       XtPointer callData);

  static void testCallback(Widget w, XtPointer clientData,
			   XtPointer callData);

  static void selectTestCallback(Widget w, XtPointer clientData,
				 XtPointer callData);

  static void modeCallback(Widget w, XtPointer clientData,
			   XtPointer callData);
  
};


#endif

