static char HydraulicSelect_id[] = "$Header: /u/oreilly/rov/tmacs/RCS/HydraulicSelect.cc,v 1.5 1998/03/12 16:11:24 oreilly Exp $";


/*
$Log: HydraulicSelect.cc,v $
Revision 1.5  1998/03/12 16:11:24  oreilly
*** empty log message ***

Revision 1.4  1997/08/12 14:45:26  oreilly
*** empty log message ***

Revision 1.3  97/04/30  19:42:27  19:42:27  oreilly (Thomas C. O'Reilly)
Now includes VbMotorSwitch

Revision 1.2  97/04/09  13:58:30  13:58:30  oreilly (Thomas C. O'Reilly)
Added statusCallback

Revision 1.1  97/03/20  12:29:38  12:29:38  oreilly (Thomas C. O'Reilly)
Initial revision

Revision 1.1  96/07/22  10:42:17  10:42:17  oreilly (Thomas C. O'Reilly)
First external release

*/
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/PushB.h>
#include <Xm/Label.h>
#include <Vk/VkInfoDialog.h>
#include "TiburonApp.h"
#include "HydraulicSelect.h"
#include "VbMotorSwitch.h"
#include "DmErrno.h"
#include "tiburon.h"

#define VbValveMnem "vbMode"
#define SledValveMnem "sledMode"
#define AuxValveMnem "auxMode"
#define ArmValveMnem "armMode"

const char *const HydraulicSelect::statusChangeCallback = "statusCallback";

HydraulicSelect::HydraulicSelect(const char *name, Widget parent)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtCreateWidget(name, xmFormWidgetClass, parent, NULL, 0);
  installDestroyHandler();

  
  _motor = 
    new HydraulicMotor("motor", _baseWidget);

  XtVaSetValues(_motor->baseWidget(), 
		XmNleftAttachment, XmATTACH_FORM,
		XmNtopAttachment, XmATTACH_FORM,
		NULL);
  
  _motor->show();

  _valveSelect = new VkCheckBox("mode", _baseWidget);

  XtVaSetValues(_valveSelect->baseWidget(),
		XmNtopAttachment, XmATTACH_FORM,
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget, _motor->baseWidget(),
		NULL);

  _valveSelect->addItem(VbValveMnem, False, 
		       &HydraulicSelect::valveSelectCallback, 
		       this);

  _valveSelect->addItem(SledValveMnem, False, 
		       &HydraulicSelect::valveSelectCallback, 
		       this);

  _valveSelect->addItem(ArmValveMnem, False,
		       &HydraulicSelect::valveSelectCallback, 
		       this);  

  _valveSelect->addItem(AuxValveMnem, False,
		       &HydraulicSelect::valveSelectCallback, 
		       this);  


  XtVaSetValues(_valveSelect->baseWidget(), XmNorientation, XmHORIZONTAL, 
		NULL);

  _valveSelect->show();
  
  //  XtManageChild(mgr);

  char itemName[MaxDmNameLen];
  char *namePtr;
  char errorBuf[errorMsgSize];
  
  strcpy(itemName, TIBURON_DM_PREFIX);
  namePtr = itemName + strlen(itemName);
  
  strcpy(namePtr, VB_HYDRAULIC_SWITCH_DM);
  _dmVbValve = new DmBooleanObject(itemName);

  strcpy(namePtr, TOOLSLED_HYDRAULIC_SWITCH_DM);
  _dmSledValve = new DmBooleanObject(itemName);

  strcpy(namePtr, SCHILLING_ARM_HYDRAULIC_SWITCH_DM);
  _dmArmValve = new DmBooleanObject(itemName);

  strcpy(namePtr, SPARE_HYDRAULIC_SWITCH_DM);
  _dmAuxValve = new DmBooleanObject(itemName);

  if (addDmObject(_dmVbValve, DmProvideFlag | DmConsumeFlag) == -1)
    return;

  if (addDmObject(_dmSledValve, DmProvideFlag | DmConsumeFlag) == -1)
    return;

  if (addDmObject(_dmArmValve, DmProvideFlag | DmConsumeFlag) == -1)
    return;

  if (addDmObject(_dmAuxValve, DmProvideFlag | DmConsumeFlag) == -1)
    return;
  
  if (setConsumePeriod(Aperiodic) == -1)
    return;
  
  updateGui();
}


void HydraulicSelect::updateGui(DM_Item handle)
{
  DM_Time t;
  MBool set;
  Errno err;
  char errorBuf[errorMsgSize];

  int selectedFlags = 0;

  if ((err = _dmVbValve->read(&set, &t)) != SUCCESS)
  {
    sprintDmError(err, "HydraulicSelect::updateGui() - Vb valve", errorBuf);
    setError(errorBuf);
  }

  if (set) {
    selectedFlags |= VbValveSelected;
    _valveSelect->setValue(VbValve, True);
  }
  else
    _valveSelect->setValue(VbValve, False);

  if ((errno = _dmSledValve->read(&set, &t)) != SUCCESS)
  {
    sprintDmError(err, "HydraulicSelect::updateGui() - Sled valve", errorBuf);
    setError(errorBuf);
  }

  if (set) {
    selectedFlags |= SledValveSelected;
    _valveSelect->setValue(SledValve, True);
  }
  else
    _valveSelect->setValue(SledValve, False);

  if ((errno = _dmArmValve->read(&set, &t)) != SUCCESS)
  {
    sprintDmError(err, "HydraulicSelect::updateGui() - Arm valve", errorBuf);
    setError(errorBuf);
  }

  if (set) {
    selectedFlags |= ArmValveSelected;
    _valveSelect->setValue(ArmValve, True);
  }
  else
    _valveSelect->setValue(ArmValve, False);

  if ((errno = _dmAuxValve->read(&set, &t)) != SUCCESS)
  {
    sprintDmError(err, "HydraulicSelect::updateGui() - Aux valve", errorBuf);
    setError(errorBuf);
  }

  if (set) {
    selectedFlags |= AuxValveSelected;
    _valveSelect->setValue(AuxValve, True);
  }
  else
    _valveSelect->setValue(AuxValve, False);

  callCallbacks(statusChangeCallback, (void *)selectedFlags);
}


vbPumpMode HydraulicSelect::mode()
{
  return _mode;
}


void HydraulicSelect::valveSelectCallback(Widget w, XtPointer clientData,
					  XtPointer callData)
{
  char *wName = XtName(w);
  HydraulicSelect *obj = (HydraulicSelect *)clientData;
  DmBooleanObject *dmObject;

  if (!strcmp(wName, VbValveMnem))
    dmObject = obj->_dmVbValve;
  else if (!strcmp(wName, SledValveMnem))
    dmObject = obj->_dmSledValve;
  else if (!strcmp(wName, AuxValveMnem))
    dmObject = obj->_dmAuxValve;
  else if (!strcmp(wName, ArmValveMnem))
    dmObject = obj->_dmArmValve;
  else 
  {
    fprintf(stderr, "HydraulicSelect::valveSelectCallback() wName=%s?\n",
	    wName);
    return;
  }

  XmToggleButtonCallbackStruct *cb = 
    (XmToggleButtonCallbackStruct *)callData;

  DM_Time t;
  gettimeofday(&t, NULL);

  if (cb->set)
    dmObject->write((MBool )TRUE, &t);
  else
    dmObject->write((MBool )FALSE, &t);
}



