/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _MOTORMICRO_H
#define _MOTORMICRO_H

#include "Micro.h"
#include "MotorDm.h"
#include <Vk/VkOptionMenu.h>
#include "moogdef.h"

/*
CLASS 
MotorMicro

DESCRIPTION
Describes Moog motor micro, has methods for generating GUIs

AUTHOR
Tom O'Reilly
*/
class MotorMicro : public Micro
{
  public:
  MotorMicro(const char *name, const char *dmPrefix);
  ~MotorMicro();
  
  virtual const char *className()
  {
    return "MotorMicro";
  }
  
  virtual Type type()
  {
    return MotorMicroType;
  }
 
  virtual MicroGui *gui(Widget parent, int period);
  virtual MicroH2OTemp *h2OTemp(Widget parent, int period); 

  MotorDm *motorDm;

  protected:
};


class MotorH2OTemp : public MicroH2OTemp
{
  public:
  MotorH2OTemp(const char *name, Widget parent, MotorMicro *motorMicro,
	       int period);
  
  ~MotorH2OTemp();
  
  virtual const char *className()
  {
    return "MotorH2OTemp";
  }

  protected:
};


class MotorMicroGui : public MbariMicroGui
{
  public:
  MotorMicroGui(const char *name, Widget parent, MotorMicro *motor, 
		int period);

  ~MotorMicroGui();
  
  virtual const char *className()
  {
    return "MotorMicroGui";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  MotorMicro *_motorMicro;
  DynamicLabel *_microTemp;
  DynamicLabel *_nvRamCycles;
  DynamicLabel *_nvRamInitialized;
  DynamicLabel *_nvRamDate;
  DynamicLabel *_velocity;
  DynamicLabel *_status;
  DynamicLabel *_cmdThrust;
  DynamicLabel *_cmdPower;

  VkOptionMenu *_cntrlMode;
  VkOptionMenu *_regenLimitMode;
  Widget _motorSerialNo;
  TextField *_torqueOffset;
  TextField *_currentGain;
  TextField *_torqueGain;
  TextField *_velocityGains[VELOCITY_GAIN_SIZE];
  TextField *_linearGains[LINEARIZED_GAIN_SIZE];
  TextField *_modelParamK4;
  TextField *_regenLimit;

  Boolean _initial;
  
  struct Values
  {
    Values();
    ~Values();
    
    Int16 microTemp;
    Int16 velocity;
    Int16 status;
    Nat16 nvRamCycles;
    char *nvRamDate;
    char *motorSerialNo;
    Nat32 cntrlMode;
    Int16 cmdThrust;
    Int16 cmdPower;
    Int16 currentGain;
    Int16 torqueGain;
    Int16 torqueOffset;
    Int16 velocityGains[VELOCITY_GAIN_SIZE];
    Int16 linearGains[LINEARIZED_GAIN_SIZE];
    Int16 modelParamK4;
    MBool regenLimitMode;
    Nat16 regenLimit;
  };
  
  Values _values;
  
  void writeRegenLimitMode(MBool enabled);
  void writeCntrlMode(motorCtrlMode mode);

  void writeValue(VkCallbackObject *obj, void *clientData, 
			  void *callData);

  void nvRamWrite();
  
  static VkMenuDesc _regenLimitModeMenuDesc[];
  static VkMenuDesc _cntrlModeMenuDesc[];

  
  private:
  static void nvRamWriteCallback(Widget w, 
				 XtPointer clientData, XtPointer callData);

  static void regenLimitEnabledCallback(Widget w,
					XtPointer clientData, 
					XtPointer callData);

  static void regenLimitDisabledCallback(Widget w,
					 XtPointer clientData, 
					 XtPointer callData);

  static void regenLimitModeCallback(Widget w,
				     XtPointer clientData, XtPointer callData);

  static void currentCntrlModeCallback(Widget w,
				       XtPointer clientData, 
				       XtPointer callData);

  static void torqueCntrlModeCallback(Widget w,
				      XtPointer clientData, 
				      XtPointer callData);

  static void velocityCntrlModeCallback(Widget w,
					XtPointer clientData, 
					XtPointer callData);

  static void linearCntrlModeCallback(Widget w,
				      XtPointer clientData, 
				      XtPointer callData);
};


#endif
