static char VehicleState_id[] = "$Header: VehicleState.cc,v 1.4 97/08/12 15:01:17 oreilly Exp $";


/*
$Log:	VehicleState.cc,v $
Revision 1.4  97/08/12  15:01:17  15:01:17  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.3  97/06/16  16:00:04  16:00:04  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.2  96/10/28  09:12:51  09:12:51  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.1  96/07/22  10:42:18  10:42:18  oreilly (Thomas C. O'Reilly)
First external release

*/
#include <Xm/RowColumn.h>
#include <Xm/Form.h>
#include <Xm/Label.h>
#include "VehicleState.h"
#include "TiburonApp.h"
#include "Alarm.h"
#include "tiburon.h"


XtResource VehicleState::_resources[] = 
{
  "dryForeground",
  "DryForeground",
  XtRPixel,
  sizeof(Pixel),
  XtOffset(VehicleState *, _dryForeground),
  XmRString, "white",

  "dryBackground",
  "DryBackground",
  XtRPixel,
  sizeof(Pixel),
  XtOffset(VehicleState *, _dryBackground),
  XmRString, "brown",

  "wetForeground",
  "WetForeground",
  XtRPixel,
  sizeof(Pixel),
  XtOffset(VehicleState *, _wetForeground),
  XmRString, "white",

  "wetBackground",
  "WetBackground",
  XtRPixel,
  sizeof(Pixel),
  XtOffset(VehicleState *, _wetBackground),
  XmRString, "blue",
};


VehicleState::VehicleState(const char *name, Widget parent)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtVaCreateWidget(_name, xmFormWidgetClass, parent, 
				 XmNresizePolicy, XmRESIZE_NONE,
				 XmNresizable, True,
				 NULL);

  getResources(_resources, XtNumber(_resources));
  
  installDestroyHandler();

  _label = XtVaCreateManagedWidget("vehicleState", xmLabelWidgetClass, 
				   _baseWidget, 
//				   XmNrecomputeSize, True,
				   XmNtopAttachment, XmATTACH_FORM,
				   XmNleftAttachment, XmATTACH_FORM,
				   XmNrightAttachment, XmATTACH_FORM,
				   XmNbottomAttachment, XmATTACH_FORM,
				   NULL);

  XtManageChild(_baseWidget);
  
  // Create data manager items
  char itemName[MaxDmNameLen];
  strcpy(itemName, TIBURON_DM_PREFIX);
  char *namePtr = itemName + strlen(itemName);
  char errorBuf[errorMsgSize];
  
  strcpy(namePtr, TIBURON_ALIVE_DM);
  _dmAlive = new DmBooleanObject(itemName);
  if (_dmAlive->error())
  {
    _dmAlive->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  if (addDmObject(_dmAlive, DmConsumeFlag) == -1)
    return;
  
  strcpy(namePtr, TIBURON_IN_WATER_DM);
  _dmInWater = new DmBooleanObject(itemName);
  if (_dmInWater->error())
  {
    _dmInWater->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }  
  if (addDmObject(_dmInWater, DmConsumeFlag) == -1)
    return;

  
  setConsumePeriod(Aperiodic);

  updateGui();
}



void VehicleState::updateGui(DM_Item handle)
{
  DM_Time t;
  MBool inWater, alive;
  char errorBuf[errorMsgSize];
  
  if (_dmAlive->read(&alive, &t) != SUCCESS)
  {
    _dmAlive->errorMsg(errorBuf);
    setError(errorBuf);
  }

  if (_dmInWater->read(&inWater, &t) != SUCCESS)
  {
    _dmInWater->errorMsg(errorBuf);
    setError(errorBuf);
  }
  
  char *ptr;
  
  Pixel foreground, background;

  if (!alive)
  {
    ptr = "Down";
    TiburonApp *app = (TiburonApp *)theApplication;  
    app->priorityColors(Priority1, &foreground, &background);
  }
  else if (!inWater)
  {
    ptr = "Dry";
    foreground = _dryForeground;
    background = _dryBackground;
  }
  else
  {
    ptr = "InWater";
    foreground = _wetForeground;
    background = _wetBackground;
  }

  XmString xmstr = XmStringCreateSimple(ptr);
  
  XtVaSetValues(_label, XmNlabelString, xmstr, 
		XmNforeground, foreground, XmNbackground, background, NULL);
  
  XmStringFree(xmstr);
}
