
static char AlarmedBarGuage_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/AlarmedBarGuage.cc,v 1.2 1997/05/07 17:02:09 oreilly Exp $";

/*
$Log: AlarmedBarGuage.cc,v $
Revision 1.2  1997/05/07 17:02:09  oreilly
Delete contained _alarmDetector in destructor

Revision 1.1  96/10/28  09:11:42  09:11:42  oreilly (Thomas C. O'Reilly)
Initial revision

*/
#include <Xm/Form.h>
#include "AlarmedBarGuage.h"
#include "TiburonApp.h"


XtResource AlarmedBarGuage::_resources[] = 
{
  {
    "alarmBackground",
    "AlarmBackground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(AlarmedBarGuage *, _alarmBackground),
    XmRString, 
    "white"
  },

  {
    "nonAlarmBackground",
    "NonAlarmBackground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(AlarmedBarGuage *, _okBackground),
    XmRString, 
    "white"
  },

  {
    "nonAlarmForeground",
    "NonAlarmForeground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(AlarmedBarGuage *, _okForeground),
    XmRString, 
    "lightgray"
  }
};

AlarmedBarGuage::AlarmedBarGuage(const char *name, Widget parent)
  : DmGuiObject(name, parent)
{
  _parent = parent;
}


AlarmedBarGuage::AlarmedBarGuage(const char *name, Widget parent,
				 DmObject *dmObject, int period, 
				 Alarm *alarm,
				 float min, float max, Side labelSide,
				 Boolean addTickMarks, Side tickSide)
  : DmGuiObject(name, parent)
{
  _parent = parent;
  _alarmDetector = NULL;
  initialize(dmObject, period, alarm, min, max, labelSide, 
	     addTickMarks, tickSide);
}


AlarmedBarGuage::~AlarmedBarGuage()
{
  if (_alarmDetector)
    delete _alarmDetector;
}


void AlarmedBarGuage::initialize(DmObject *dmObject, int period,
				 Alarm *alarm, float min, float max,
				 Side labelSide,
				 Boolean addTickMarks, Side tickSide)
{
  _guage = new LabeledBarGuage(_name, _parent, min, max, labelSide, 
			       addTickMarks, tickSide);

  _baseWidget = _guage->baseWidget();
  
  installDestroyHandler();
  getResources(_resources, XtNumber(_resources));

  _multiplier = 1.;
  
  _guage->show();

  if (addDmObject(dmObject, DmConsumeFlag) == -1)
    return;

  if (setConsumePeriod(period) == -1)
    return;
  
  _alarmDetector = new DmInputDetector("alarmDetector", _parent, 
				       alarm->dmObject(), this);
  _alarm = alarm;

  // Force update of alarm object and appropriate GUI response
  updateFromPeer(this, NULL);
}


void AlarmedBarGuage::updateFromPeer(DmGuiObject *peer, 
					  void *clientData)
{
  _alarm->update();
  Priority priority = _alarm->priority(_alarm->value());

  Pixel valueColor, background;
  
  if (priority == NoPriority)
  {
    valueColor = _okForeground;
    background = _okBackground;
  }
  else
  {
    TiburonApp *app = (TiburonApp *)theApplication;
    Pixel foreground;
    app->priorityColors(priority, &foreground, &valueColor);
    background = _alarmBackground;
  }
  
  _guage->setColors(valueColor, background);
}


AlarmedNat16BarGuage::AlarmedNat16BarGuage(const char *name, Widget parent,
					   char *dmObjectName,
					   int period, 
					   char *alarmName,
					   float min, float max,
					   Side labelSide,
					   Boolean addTickMarks, 
					   Side tickSide)
  : AlarmedBarGuage(name, parent)
{
  _dmObject = new DmNat16Object(dmObjectName);
  Alarm *alarm;
  if ((alarm = ((TiburonApp *)theApplication)->systemAlarms->
       find(alarmName)) == NULL)
  {
    char errorBuf[errorMsgSize];
    sprintf(errorBuf, "AlarmedNat16BarGuage() - couldn't find alarm \"%s\"",
	    alarmName);
    setError(errorBuf);
    return;
  }

  initialize(_dmObject, period, alarm, min, max, labelSide, 
	     addTickMarks, tickSide);

  updateGui();
}


AlarmedNat16BarGuage::AlarmedNat16BarGuage(const char *name, Widget parent,
					   DmNat16Object *dmObject, 
					   int period, 
					   Alarm *alarm, 
					   float min, float max,
					   Side labelSide,
					   Boolean addTickMarks, 
					   Side tickSide)

  : AlarmedBarGuage(name, parent, dmObject, period, alarm, min, max,
		    labelSide, addTickMarks, tickSide)
{
  _dmObject = dmObject;
  updateGui();
}


void AlarmedNat16BarGuage::updateGui(DM_Item handle)
{
  DM_Time t;
  char errorBuf[errorMsgSize];
  Nat16 ivalue;
  Errno errno;
  
  if ((errno = _dmObject->read(&ivalue, &t)) != SUCCESS)
  {
    _dmObject->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  _guage->set((float )ivalue * _multiplier);
  return;
}


AlarmedFlt32BarGuage::AlarmedFlt32BarGuage(const char *name, Widget parent,
					   char *dmObjectName,
					   int period, 
					   char *alarmName,
					   float min, float max,
					   Side labelSide,
					   Boolean addTickMarks, 
					   Side tickSide)
  : AlarmedBarGuage(name, parent)
{
  _dmObject = new DmFlt32Object(dmObjectName);
  Alarm *alarm;
  if ((alarm = ((TiburonApp *)theApplication)->systemAlarms->
       find(alarmName)) == NULL)
  {
    char errorBuf[errorMsgSize];
    sprintf(errorBuf, "AlarmedFlt32BarGuage() - couldn't find alarm \"%s\"",
	    alarmName);
    setError(errorBuf);
    return;
  }

  initialize(_dmObject, period, alarm, min, max, labelSide, 
	     addTickMarks, tickSide);

  updateGui();
}


AlarmedFlt32BarGuage::AlarmedFlt32BarGuage(const char *name, Widget parent,
					   DmFlt32Object *dmObject, 
					   int period, 
					   Alarm *alarm, 
					   float min, float max,
					   Side labelSide,
					   Boolean addTickMarks, 
					   Side tickSide)

  : AlarmedBarGuage(name, parent, dmObject, period, alarm, min, max,
		    labelSide, addTickMarks, tickSide)
{
  _dmObject = dmObject;
  updateGui();
}


void AlarmedFlt32BarGuage::updateGui(DM_Item handle)
{
  DM_Time t;
  char errorBuf[errorMsgSize];
  Flt32 value;
  Errno errno;
  
  if ((errno = _dmObject->read(&value, &t)) != SUCCESS)
  {
    _dmObject->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  _guage->set(value * _multiplier);
  return;
}


