/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _SEMIMOTORMICRO_H
#define _SEMIMOTORMICRO_H

#include "Micro.h"
#include "SemiMotorDm.h"
#include <Vk/VkOptionMenu.h>

/*
CLASS 
SemiMotorMicro

DESCRIPTION
Contains information on SemiPower motor micros, methods for generating
GUIs.

AUTHOR
Tom O'Reilly
*/
class SemiMotorMicro : public Micro
{
  public:
  SemiMotorMicro(const char *name, const char *dmPrefix);
  ~SemiMotorMicro();
  
  virtual const char *className()
  {
    return "SemiMotorMicro";
  }
  
  virtual Type type()
  {
    return MotorMicroType;
  }
 
  virtual MicroGui *gui(Widget parent, int period);
  virtual MicroH2OTemp *h2OTemp(Widget parent, int period); 

  SemiMotorDm *motorDm;

  protected:
};


/*
CLASS 
SemiMotorH2OTemp

DESCRIPTION
Display temperature, humidity, water alarm status for SemiMotorMicro

AUTHOR
Tom O'Reilly
*/
class SemiMotorH2OTemp : public MicroH2OTemp
{
  public:
  SemiMotorH2OTemp(const char *name, Widget parent, SemiMotorMicro *motorMicro,
	       int period);
  
  ~SemiMotorH2OTemp();
  
  virtual const char *className()
  {
    return "SemiMotorH2OTemp";
  }

  protected:
};


/*
CLASS 
SemiMotorMicroGui

DESCRIPTION
Display and control for SemiMotorMicro

AUTHOR
Tom O'Reilly
*/
class SemiMotorMicroGui : public MicroGui
{
  public:
  SemiMotorMicroGui(const char *name, Widget parent, SemiMotorMicro *motor, 
		    int period);

  ~SemiMotorMicroGui();
  
  virtual const char *className()
  {
    return "SemiMotorMicroGui";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  SemiMotorMicro *_motorMicro;
  AlarmedInt16Text *_heatSinkTemp;
  AlarmedNat16Text *_humidity;
  DynamicLabel *_velocity;
  DynamicLabel *_status;
  DynamicLabel *_cmdThrust;
  Widget _elapsedHours;
  DynamicLabel *_outputPower;
  DynamicLabel *_inputVoltage;
  DynamicLabel *_torque;

  VkOptionMenu *_cntrlMode;
  DynamicLabel *_current;
  TextField *_currentGain;
  TextField *_velocityGains[VELOCITY_GAIN_SIZE];
  TextField *_modelParamK4;
  Widget _readFaultQueue;
  Widget _clearFaultQueue;
  Widget _faultQueueEntry[FAULT_QUEUE_LENGTH];
  Widget _faultCode;

  Boolean _initial;
  
  struct Values
  {
    Values();
    ~Values();
    
    Int16 heatSinkTemp;
    Int16 velocity;
    Int32 status;
    Nat32 cntrlMode;
    Int16 cmdThrust;
    Nat16 current;
    Int16 currentGain;
    Int16 velocityGains[VELOCITY_GAIN_SIZE];
    Int16 modelParamK4;
    Int32 faultCode;
    Nat16 elapsedHours;
    Nat16 outputPower;
    Nat16 inputVoltage;
    Int16 torque;
    DmMotorFaultObject::Queue queue;
  };
  
  Values _values;
  
  void writeCntrlMode(motorCtrlMode mode);

  void writeValue(VkCallbackObject *obj, void *clientData, 
			  void *callData);

  static VkMenuDesc _cntrlModeMenuDesc[];

  
  private:

  static void currentCntrlModeCallback(Widget w,
				       XtPointer clientData, 
				       XtPointer callData);

  static void velocityCntrlModeCallback(Widget w,
					XtPointer clientData, 
					XtPointer callData);

  static void semiCntrlModeCallback(Widget w,
				    XtPointer clientData, 
				    XtPointer callData);


  static void faultQueueCallback(Widget w,
				 XtPointer clientData, 
				 XtPointer callData);
};


#endif
