#ifndef _MICROGUI_H
#define _MICROGUI_H

#include "DmGuiObject.h"
#include "MicroDm.h"
#include "TextField.h"
#include "moogdef.h"
#include "AlarmText.h"
#include "AlarmedText.h"
#include "AlarmedTable.h"
#include "Gf5vSelfTest.h"

#define Column2 40
#define TextFieldWidth 12

#define MicroH2OTempColumns 5
#define MicroGfColumns 3
#define MicroGf5vColumns 7

#define SampledChanBorderWidth 1

#define NameColumn 0

#define TemperatureColumn 1
#define HumidityColumn 2
#define HousingWaterColumn 3
#define JboxWaterColumn 4

#define Chan0Column 1
#define Chan1Column 2
#define Chan2Column 3
#define Chan3Column 4
#define OffsetColumn 5
#define VicorVoltageColumn 6

#define LocalGfColumn 1
#define ExternGfColumn 2

class Micro;
class Ibc;
class Dcon;


// GfScanner draws a box around currently-sampled channel widget
class GfScanner : public DmGuiObject
{
  public:

  GfScanner(const char *name, Widget parent, 
	    DmInt16Object *dmSampledChannel,
	    Widget *channelWidgets,
	    int period);

  ~GfScanner();
  
  virtual const char *className()
  {
    return "GfScanner";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:

  DmInt16Object *_dmSampledChannel;
  Widget _channelWidgets[N_GF5V_CHANNELS];

  Pixel _sampledChanColor, _background;
  int _prevSampledChannelMask;  
};


class MicroH2OTempHeader : public AlarmedTableHeader
{
  public:
  MicroH2OTempHeader(const char *name, Widget parent);

  ~MicroH2OTempHeader()
  {
  }

  const char *className()
  {
    return "MicroH2OTempHeader";
  }
};


class MicroGfHeader : public AlarmedTableHeader
{
  public:
  MicroGfHeader(const char *name, Widget parent);

  ~MicroGfHeader()
  {
  }

  const char *className()
  {
    return "MicroGfHeader";
  }
};


class MicroGf5vHeader : public AlarmedTableHeader
{
  public:
  MicroGf5vHeader(const char *name, Widget parent);

  ~MicroGf5vHeader()
  {
  }

  const char *className()
  {
    return "MicroGf5vHeader";
  }
};



/*
MicroH2OTemp is the base class for a family of GUIs that display 
environmental parameters (temperature, humidity, etc.) of various micros
*/
class MicroH2OTemp : public AlarmedTableRow
{
  friend class MicroH2OTempHeader;
  
  public:
  MicroH2OTemp(const char *name, Widget parent);

  ~MicroH2OTemp();
  
  virtual const char *className()
  {
    return "MicroH2OTemp";
  }

  // Return current alarm priority of given column
  virtual Priority priority(int column);

  protected:
  AlarmedInt16Text *_temp;
  AlarmedNat16Text *_humidity;
  AlarmText *_housingWater;
  AlarmText *_jboxWater;
  Widget _jboxWaterLabel;

  virtual void addCallbacks();

  virtual void alarmUpdate(VkCallbackObject *obj,
			   void *clientData,
			   void *callData);
};


class IbcH2OTemp : public MicroH2OTemp
{
  public:
  IbcH2OTemp(const char *name, Widget parent, Ibc *ibc, int period);

  ~IbcH2OTemp();

  virtual const char *className()
  {
    return "IbcH2OTemp";
  }
};



class DconH2OTemp : public IbcH2OTemp
{
  public:
  DconH2OTemp(const char *name, Widget parent, Ibc *ibc, int period);
  
  ~DconH2OTemp();

  virtual const char *className()
  {
    return "DconH2OTemp";
  }

};


/*
MicroGf is the base class for a family of GUIs that display 
ground fault information of various micros
*/
class MicroGf : public AlarmedTableRow
{
  friend class MicroGfHeader;
  
  public:
  MicroGf(const char *name, Widget parent);

  ~MicroGf();
  
  virtual const char *className()
  {
    return "MicroGf";
  }
  
  // Return current alarm priority of given column
  virtual Priority priority(int column);

  protected:
  AlarmedInt16Text *_localGf;
  AlarmedInt16Text *_externGf;

  virtual void addCallbacks();

  virtual void alarmUpdate(VkCallbackObject *obj,
			   void *clientData,
			   void *callData);

};


/*
MicroGf5v is the base class for a family of GUIs that display 
5 volt ground fault board information of various micros
*/
class MicroGf5v : public AlarmedTableRow
{
  friend class MicroGf5vHeader;
  
  public:
  MicroGf5v(const char *name, Widget parent);

  ~MicroGf5v();
  
  virtual const char *className()
  {
    return "MicroGf5v";
  }
  
  // Return current alarm priority of given column
  virtual Priority priority(int column);

  protected:

  AlarmedInt16Text *_current[N_GF5V_CHANNELS];
  AlarmedInt16Text *_offset;
  AlarmedInt16Text *_vicorVoltage;

  virtual void addCallbacks();

  virtual void alarmUpdate(VkCallbackObject *obj,
			   void *clientData,
			   void *callData);

};


class Alarm;

class IbcGf : public MicroGf5v
{
  public:
  IbcGf(const char *name, Widget parent, Ibc *ibc, int period);
  
  ~IbcGf();
  

  virtual const char *className()
  {
    return "IbcGf";
  }

  protected:
  GfScanner *_scanner;
};



/*
Display items associated with Gf 5 volt board
*/
class Gf5vGui : public DmGuiObject
{
  public:
  
  Gf5vGui(const char *name, Widget parent, Gf5vDm *gf5vDm, int period,
	  Boolean showCapacitorData = False);

  ~Gf5vGui();

  virtual const char *className()
  {
    return "Gf5vGui";
  }
  

  virtual void updateGui(DM_Item handle = 0);

  protected:

  Gf5vSelfTest *_selfTest;
  int _prevSampledChannelMask;
  Gf5vDm *_gf5vDm;
  TextField *_chargeTime[N_GF5V_CHANNELS];
  Int32 _prevChargeTime[N_GF5V_CHANNELS];
  AlarmedInt16Text *_current[N_GF5V_CHANNELS];
  AlarmedInt16Text *_temp;
  AlarmedInt16Text *_offset;
  AlarmedInt16Text *_vicorVolt;
  AlarmedNat16Text *_capacitance;
  AlarmedInt16Text *_capacitorCurrent;
  Widget _scanEnableButton;
  MBool _prevScanEnabled;
  
  Boolean _showCapacitorData;
  
  Pixel _sampledChanBorderColor;
  Pixel _background;
  
  Dimension _sampledChanBorderWidth;

  void toggleScanEnable(Boolean enable);
  
  void writeChargeTime(VkCallbackObject *obj,
		       void *clientData,
		       void *callData);

  private:
  
  static XtResource _resources[];

  static void scanEnableCallback(Widget w, 
				 XtPointer clientData,
				 XtPointer callData);

};



/*
MicroGui displays info common to all micros.
*/
class MicroGui : public DmGuiObject
{
  public:
  MicroGui(const char *name, Widget parent, Micro *micro);
  ~MicroGui();
  
  virtual const char *className()
  {
    return "MicroGui";
  }

  virtual void updateFromPeer(DmGuiObject *peer, XtPointer clientData);

  protected:
  Micro *_micro;

  AlarmText *_ramTestStatus;
  Widget _softwareRev;
  Widget _id;
  Widget _microSerialNo;

  DmInputDetector *_resetDetector;
  DmInputDetector *_softwareRevDetector;
  DmInputDetector *_idDetector;
  DmInputDetector *_serialNoDetector;
  
  void writeReset();
  void writeValue(VkCallbackObject *obj, void *clientData, 
		  void *callData);
  
  private:
  static void resetCallback(Widget w, 
			    XtPointer clientData, XtPointer callData);
  
};



class IbcGui : public MicroGui
{
  public:
  IbcGui(const char *name, Widget parent, Ibc *ibc, int period);
  ~IbcGui();

  virtual const char *className()
  {
    return "IbcGui";
  }
  
  virtual void updateGui(DM_Item handle = 0);

  protected:
  Ibc *_ibc;
  Widget _cardConfig;
  DynamicLabel *_cardError;
  Gf5vGui *_gf5vGui;
  AlarmedNat16Text *_humidity;
  AlarmText *_housingWater;
  AlarmText *_jboxWater;
};


class Dcon;

class DconGui : public IbcGui
{
  public:
  DconGui(const char *name, Widget parent, Dcon *dcon, int period);
  ~DconGui();

  virtual const char *className()
  {
    return "DconGui";
  }
  
  virtual void updateGui(DM_Item handle = 0);

  protected:
  Dcon *_dcon;
};



#endif



