
static char DmBarGuage_id[] = "$Header: DmBarGuage.cc,v 1.3 97/05/07 17:18:59 oreilly Exp $";

/*
$Log:	DmBarGuage.cc,v $
Revision 1.3  97/05/07  17:18:59  17:18:59  oreilly (Thomas C. O'Reilly)
Delete DmInputDetector in destructor

Revision 1.2  97/03/20  12:29:07  12:29:07  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.1  96/10/28  09:11:56  09:11:56  oreilly (Thomas C. O'Reilly)
Initial revision

*/
#include <Xm/Form.h>
#include <Xm/Label.h>
#include "DmBarGuage.h"
#include "TiburonApp.h"


XtResource DmBarGuage::_resources[] = 
{
  {
    "alarmBackground",
    "AlarmBackground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(DmBarGuage *, _alarmBackground),
    XmRString, 
    "white"
  },

  {
    "nonAlarmBackground",
    "NonAlarmBackground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(DmBarGuage *, _okBackground),
    XmRString, 
    "white"
  },

  {
    "nonAlarmForeground",
    "NonAlarmForeground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(DmBarGuage *, _okForeground),
    XmRString, 
    "lightgray"
  }
};

DmBarGuage::DmBarGuage(const char *name, Widget parent)
  : DmGuiObject(name, parent)
{
  _parent = parent;
  _alarmDetector = NULL;
}


DmBarGuage::DmBarGuage(const char *name, Widget parent,
		       DmObject *dmObject, int period, 
		       Alarm *alarm,
		       float min, float max, Side labelSide,
		       Boolean addTickMarks, Side tickSide,
		       const char *valueFormat)
  : DmGuiObject(name, parent)
{
  _parent = parent;
  initialize(dmObject, period, alarm, min, max, labelSide, 
	     addTickMarks, tickSide, valueFormat);
}



void DmBarGuage::initialize(DmObject *dmObject, int period,
			    Alarm *alarm, float min, float max,
			    Side labelSide,
			    Boolean addTickMarks, Side tickSide,
			    const char *valueFormat)
{
  _baseWidget = XtCreateWidget(_name, xmFormWidgetClass, _parent, NULL, 0);
  
  installDestroyHandler();
  getResources(_resources, XtNumber(_resources));
  
  _guage = new LabeledBarGuage(_name, _baseWidget, min, max, labelSide, 
			       addTickMarks, tickSide, valueFormat);

  XtVaSetValues(_guage->baseWidget(),
		XmNtopAttachment, XmATTACH_FORM,
		XmNbottomAttachment, XmATTACH_FORM,
		NULL);
  
  _guage->show();

  setMultiplier(1.);
  
  if (addDmObject(dmObject, DmConsumeFlag) == -1)
    return;

  if (setConsumePeriod(period) == -1)
    return;
  
  _alarm = alarm;
  if (_alarm)
  {
    _alarmDetector = new DmInputDetector("alarmDetector", _parent, 
					 _alarm->dmObject(), this);

    // Force update of alarm object and appropriate GUI response
    updateFromPeer(this, NULL);
  }

  _prevValue = MAXFLOAT;
}


void DmBarGuage::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);
}


DmNat16BarGuage::DmNat16BarGuage(const char *name, Widget parent,
				 char *dmObjectName,
				 int period, 
				 char *alarmName,
				 float min, float max,
				 Side labelSide,
				 Boolean addTickMarks, 
				 Side tickSide,
				 const char *valueFormat)
  : DmBarGuage(name, parent)
{
  char errorBuf[errorMsgSize];
  _dmObject = new DmNat16Object(dmObjectName);
  if (_dmObject->error())
  {
    _dmObject->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  Alarm *alarm;

  if (alarmName)
  {
    if ((alarm = ((TiburonApp *)theApplication)->systemAlarms->
	 find(alarmName)) == NULL)
    {
      sprintf(errorBuf, "DmNat16BarGuage() - couldn't find alarm \"%s\"",
	      alarmName);
      setError(errorBuf);
      return;
    }
  }
  else
    alarm = NULL;
  
  initialize(_dmObject, period, alarm, min, max, labelSide, 
	     addTickMarks, tickSide, valueFormat);

  updateGui();
}


DmNat16BarGuage::DmNat16BarGuage(const char *name, Widget parent,
				 DmNat16Object *dmObject, 
				 int period, 
				 Alarm *alarm, 
				 float min, float max,
				 Side labelSide,
				 Boolean addTickMarks, 
				 Side tickSide,
				 const char *valueFormat)

  : DmBarGuage(name, parent, dmObject, period, alarm, min, max,
		    labelSide, addTickMarks, tickSide, valueFormat)
{
  _dmObject = dmObject;
  updateGui();
}


void DmNat16BarGuage::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;
  }
  if ((float )ivalue != _prevValue) 
    _guage->set((float )ivalue * _multiplier);

  _prevValue = (float )ivalue;
  return;
}


DmInt16BarGuage::DmInt16BarGuage(const char *name, Widget parent,
				 char *dmObjectName,
				 int period, 
				 char *alarmName,
				 float min, float max,
				 Side labelSide,
				 Boolean addTickMarks, 
				 Side tickSide,
				 const char *valueFormat)
  : DmBarGuage(name, parent)
{
  char errorBuf[errorMsgSize];
  _dmObject = new DmInt16Object(dmObjectName);
  if (_dmObject->error())
  {
    _dmObject->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  Alarm *alarm;

  if (alarmName)
  {
    if ((alarm = ((TiburonApp *)theApplication)->systemAlarms->
	 find(alarmName)) == NULL)
    {
      sprintf(errorBuf, "DmInt16BarGuage() - couldn't find alarm \"%s\"",
	      alarmName);
      setError(errorBuf);
      return;
    }
  }
  else
    alarm = NULL;
  
  initialize(_dmObject, period, alarm, min, max, labelSide, 
	     addTickMarks, tickSide, valueFormat);

  updateGui();
}


DmInt16BarGuage::DmInt16BarGuage(const char *name, Widget parent,
				 DmInt16Object *dmObject, 
				 int period, 
				 Alarm *alarm, 
				 float min, float max,
				 Side labelSide,
				 Boolean addTickMarks, 
				 Side tickSide,
				 const char *valueFormat)

  : DmBarGuage(name, parent, dmObject, period, alarm, min, max,
		    labelSide, addTickMarks, tickSide, valueFormat)
{
  _dmObject = dmObject;
  updateGui();
}


void DmInt16BarGuage::updateGui(DM_Item handle)
{
  DM_Time t;
  char errorBuf[errorMsgSize];
  Int16 ivalue;
  Errno errno;
  
  if ((errno = _dmObject->read(&ivalue, &t)) != SUCCESS)
  {
    _dmObject->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  if ((float )ivalue != _prevValue)
    _guage->set((float )ivalue * _multiplier);

  _prevValue = (float )ivalue;

  return;
}


DmFlt32BarGuage::DmFlt32BarGuage(const char *name, Widget parent,
				 char *dmObjectName,
				 int period, 
				 char *alarmName,
				 float min, float max,
				 Side labelSide,
				 Boolean addTickMarks, 
				 Side tickSide,
				 const char *valueFormat)
  : DmBarGuage(name, parent)
{
  char errorBuf[errorMsgSize];
  _dmObject = new DmFlt32Object(dmObjectName);
  if (_dmObject->error())
  {
    _dmObject->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  Alarm *alarm;

  if (alarmName)
  {
    if ((alarm = ((TiburonApp *)theApplication)->systemAlarms->
	 find(alarmName)) == NULL)
    {
      sprintf(errorBuf, "DmFlt32BarGuage() - couldn't find alarm \"%s\"",
	      alarmName);
      setError(errorBuf);
      return;
    }
  }
  else
    alarm = NULL;
  
  initialize(_dmObject, period, alarm, min, max, labelSide, 
	     addTickMarks, tickSide, valueFormat);

  updateGui();
}


DmFlt32BarGuage::DmFlt32BarGuage(const char *name, Widget parent,
				 DmFlt32Object *dmObject, 
				 int period, 
				 Alarm *alarm, 
				 float min, float max,
				 Side labelSide,
				 Boolean addTickMarks, 
				 Side tickSide,
				 const char *valueFormat)

  : DmBarGuage(name, parent, dmObject, period, alarm, min, max,
		    labelSide, addTickMarks, tickSide, valueFormat)
{
  _dmObject = dmObject;
  updateGui();
}


void DmFlt32BarGuage::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;
  }

  if (value != _prevValue)
    _guage->set(value * _multiplier);

  _prevValue = value;

  return;
}


